перенаправляет вывод со stdout на stderr.
Конструкция scriptname >>filename добавляет вывод scriptname к файлу filename. Если задано имя несуществующего файла, то он создается.
подстановка процесса.
(command)>
<(command)
В операциях сравнения, символы "<" и ">" обозначают операции сравнения строк .
А так же -- операции сравнения целых чисел. См. так же Пример 12-6.
<<
перенаправление ввода на встроенный документ.
<, >
Посимвольное ASCII-сравнение.
veg1=carrots
veg2=tomatoes
if [[ "$veg1" < "$veg2" ]] then echo "Не смотря на то, что в словаре слово $veg1 предшествует слову $veg2," echo "это никак не отражает мои кулинарные предпочтения." else echo "Интересно. Каким словарем вы пользуетесь?" fi
\<, \> границы отдельных слов в регулярных выражениях. bash$ grep '\<the\>' textfile | конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку. echo ls -l | sh # Передает вывод "echo ls -l" команлному интерпретатору shell, #+ тот же результат дает простая команда "ls -l".
cat *.lst | sort | uniq # Объединяет все файлы ".lst", сортирует содержимое и удаляет повторяющиеся строки.
Конвейеры (еще их называют каналами) -- это классический способ взаимодействия процессов, с помощью которого stdout одного процесса перенаправляется на stdin другого. Обычно используется совместно с командами вывода, такими как cat или echo, от которых поток данных поступает в "фильтр" (команда, которая на входе получает данные, преобразует их и обрабатывает). cat $filename | grep $search_word В конвейер могут объединяться и сценарии на языке командной оболочки. #!/bin/bash # uppercase.sh : Преобразование вводимых символов в верхний регистр.
tr 'a-z' 'A-Z' # Диапазоны символов должны быть заключены в кавычки #+ чтобы предотвратить порождение имен файлов от однобуквенных имен файлов.
exit 0 А теперь попробуем объединить в конвейер команду ls -l с этим сценарием. bash$ ls -l | ./uppercase.sh -RW-RW-R-- 1 BOZO BOZO 109 APR 7 19:49 1.TXT -RW-RW-R-- 1 BOZO BOZO 109 APR 14 16:48 2.TXT -RW-R--R-- 1 BOZO BOZO 725 APR 20 20:56 DATA-FILE
Выход stdout каждого процесса в конвейере должен читаться на входе stdin последующим, в конвейере, процессом. Если этого не делается, то поток данных блокируется, в результате конвейер будет работать не так как ожидается. cat file1 file2 | ls -l | sort # Вывод команды "cat file1 file2" будет утерян.
Конвейер исполняется в дочернем процессе, а посему -- не имеет доступа к переменным сценария. variable="initial_value" echo "new_value" | read variable echo "variable = $variable" # variable = initial_value
Если одна из команд в конвейере завершается аварийно, то это приводит к аварийному завершению работы всего конвейера. >| принудительное перенаправление, даже если установлен ключ noclobber option. || логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА). & Выполнение задачи в фоне. Команда, за которой стоит &, будет исполняться в фоновом режиме. bash$ sleep 10 & [1] 850 [1]+ Done sleep 10
В сценариях команды, и даже циклы могут запускаться в фоновом режиме. (обратно)
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) <a.cox@swansea.ac.uk>, за небольшие поправки]
# 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) с исходными текстами
if [[ "$veg1" < "$veg2" ]] then echo "Не смотря на то, что в словаре слово $veg1 предшествует слову $veg2," echo "это никак не отражает мои кулинарные предпочтения." else echo "Интересно. Каким словарем вы пользуетесь?" fi
\<, \> границы отдельных слов в регулярных выражениях. bash$ grep '\<the\>' textfile | конвейер. Передает вывод предыдущей команды на ввод следующей или на вход командного интерпретатора shell. Этот метод часто используется для связывания последовательности команд в единую цепочку. echo ls -l | sh # Передает вывод "echo ls -l" команлному интерпретатору shell, #+ тот же результат дает простая команда "ls -l".
cat *.lst | sort | uniq # Объединяет все файлы ".lst", сортирует содержимое и удаляет повторяющиеся строки.
Конвейеры (еще их называют каналами) -- это классический способ взаимодействия процессов, с помощью которого stdout одного процесса перенаправляется на stdin другого. Обычно используется совместно с командами вывода, такими как cat или echo, от которых поток данных поступает в "фильтр" (команда, которая на входе получает данные, преобразует их и обрабатывает). cat $filename | grep $search_word В конвейер могут объединяться и сценарии на языке командной оболочки. #!/bin/bash # uppercase.sh : Преобразование вводимых символов в верхний регистр.
tr 'a-z' 'A-Z' # Диапазоны символов должны быть заключены в кавычки #+ чтобы предотвратить порождение имен файлов от однобуквенных имен файлов.
exit 0 А теперь попробуем объединить в конвейер команду ls -l с этим сценарием. bash$ ls -l | ./uppercase.sh -RW-RW-R-- 1 BOZO BOZO 109 APR 7 19:49 1.TXT -RW-RW-R-- 1 BOZO BOZO 109 APR 14 16:48 2.TXT -RW-R--R-- 1 BOZO BOZO 725 APR 20 20:56 DATA-FILE
Выход stdout каждого процесса в конвейере должен читаться на входе stdin последующим, в конвейере, процессом. Если этого не делается, то поток данных блокируется, в результате конвейер будет работать не так как ожидается. cat file1 file2 | ls -l | sort # Вывод команды "cat file1 file2" будет утерян.
Конвейер исполняется в дочернем процессе, а посему -- не имеет доступа к переменным сценария. variable="initial_value" echo "new_value" | read variable echo "variable = $variable" # variable = initial_value
Если одна из команд в конвейере завершается аварийно, то это приводит к аварийному завершению работы всего конвейера. >| принудительное перенаправление, даже если установлен ключ noclobber option. || логическая операция OR (логическое ИЛИ). В опрециях проверки условий, оператор || возвращает 0 (success), если один из операндов имеет значение true (ИСТИНА). & Выполнение задачи в фоне. Команда, за которой стоит &, будет исполняться в фоновом режиме. bash$ sleep 10 & [1] 850 [1]+ Done sleep 10
В сценариях команды, и даже циклы могут запускаться в фоновом режиме. (обратно)
Пример 3-3. Запуск цикла в фоновом режиме
#!/bin/bash # background-loop.shfor 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) <a.cox@swansea.ac.uk>, за небольшие поправки]
# 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) с исходными текстами