Книга: Искусство программирования на языке сценариев командной оболочки

Пример 3-3. Запуск цикла в фоновом режиме

Пример 3-3. Запуск цикла в фоновом режиме

#!/bin/bash

# background-loop.sh

for i in 1 2 3 4 5 6 7 8 9 10 # Первый цикл.

do

echo -n "$i "

done & # Запуск цикла в фоне.

# Иногда возможны случаи выполнения этого цикла после второго цикла.

echo # Этот 'echo' иногда не отображается на экране.

for i in 11 12 13 14 15 16 17 18 19 20 # Второй цикл.

do

echo -n "$i "

done

echo # Этот 'echo' иногда не отображается на экране.

# ======================================================

# Ожидается, что данный сценарий выведет следующую последовательность:

# 1 2 3 4 5 6 7 8 9 10

# 11 12 13 14 15 16 17 18 19 20

# Иногда возможен такой вариант:

# 11 12 13 14 15 16 17 18 19 20

# 1 2 3 4 5 6 7 8 9 10 bozo $

# (Второй 'echo' не был выполнен. Почему?)

# Изредка возможен такой вариант:

# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# (Первый 'echo' не был выполнен. Почему?)

# Крайне редко встречается и такое:

# 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20

# Второй цикл начал исполняться раньше первого.

exit 0


Команда, исполняемая в пределах сценария в фоне, может подвесить сценарий, ожидая нажатия клавиши. К счастью, это легко "лечится".

&&

Логическая операция AND (логическое И). В операциях проверки условий, оператор && возвращает 0 (success) тогда, и только тогда, когда оба операнда имеют значение true (ИСТИНА).

-

префикс ключа. С этого символа начинаются опциональные ключи команд.

COMMAND -[Option1][Option2][...]

ls -al

sort -dfu $filename

set -- $variable

if [ $file1 -ot $file2 ]

then

echo "Файл $file1 был создан раньше чем $file2."

fi

if [ "$a" -eq "$b" ]

then

echo "$a равно $b."

fi

if [ "$c" -eq 24 -a "$d" -eq 47 ]

then

echo "$c равно 24, а $d равно 47."

fi

-

перенаправление из/в stdin или stdout. [дефис]

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)

# Перемещение полного дерева файлов и подкаталогов из одной директории в другую

# [спасибо Алану Коксу (Alan Cox) <[email protected]>, за небольшие поправки]

# 1) cd /source/directory Переход в исходный каталог, содержимое которого будет перемещено

# 2) && "И-список": благодаря этому все последующие команды будут выполнены

# только тогда, когда 'cd' завершится успешно

# 3) tar cf - . ключом 'c' архиватор 'tar' создает новый архив,

# ключом 'f' (file) и последующим '-' задается файл архива -- stdout,

# в архив помещается текущий каталог ('.') с вложенными подкаталогами.

# 4) | конвейер с ...

# 5) ( ... ) subshell-ом (дочерним экземпляром командной оболочки)

# 6) cd /dest/directory Переход в каталог назначения.

# 7) && "И-список", см. выше

# 8) tar xpvf - Разархивирование ('x'), с сохранением атрибутов "владельца" и прав доступа ('p') к файлам,

# с выдачей более подробных сообщений на stdout ('v'),

# файл архива -- stdin ('f' с последующим '-').

#

# Примечательно, что 'x' -- это команда, а 'p', 'v' и 'f' -- ключи

# Во как!

# Более элегантный вариант:

# cd source-directory

# tar cf - . | (cd ../target-directory; tar xzf -)

#

# cp -a /source/directory /dest имеет тот же эффект.

bunzip2 linux-2.4.3.tar.bz2 | tar xvf -

# --разархивирование tar-файла-- | --затем файл передается утилите "tar"--

# Если у вас утилита "tar" не поддерживает работу с "bunzip2",

# тогда придется выполнять работу в два этапа, с использованием конвейера.

# Целью данного примера является разархивирование тарбола (tar.bz2) с исходными текстами ядра.

Обратите внимание, что в этом контексте "-" - не самостоятельный оператор Bash, а скорее опция, распознаваемая некоторыми утилитами UNIX (такими как tar, cat и т.п.), которые выводят результаты своей работы в stdout.

bash$ echo "whatever" | cat -

whatever

В случае, когда ожидается имя файла, тогда "-" перенаправляет вывод на stdout (вспомните пример с tar cf) или принимает ввод с stdin.

bash$ file

Usage: file [-bciknvzL] [-f namefile] [-m magicfiles] file...

Сама по себе команда file без параметров завершается с сообщением об ошибке.

Добавим символ "-" и получим более полезный результат. Это заставит командный интерпретатор ожидать ввода от пользователя.

bash$ file -

abc

standard input: ASCII text

bash$ file -

#!/bin/bash

standard input: Bourne-Again shell script text executable

Теперь команда принимает ввод пользователя со stdin и анализирует его.

Используя передачу stdout по конвейеру другим командам, можно выполнять довольно эффектные трюки, например вставка строк в начало файла.

С помощью команды diff -- находить различия между одним файлом и частью другого:

grep Linux file1 | diff file2 -

И наконец пример использования служебного символа "-" с командой tar.

Оглавление книги


Генерация: 1.548. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз