Круглые скобки (), кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора shell.
Например,
$ (cat file1;echo .bp;cat file2)|nroff
Эта командная строка позволяет поставить между именами двух файлов, подлежащих форматированию, оператор конца страницы .bp программы nroff.
Например, скобки также удобны для выполнения в фоновом режиме целой последовательности команд, разделенных точкой с запятой.
$ (nroff –ms file2;nroff –ms file2) &
Например,
$ wc names* ; who | wc
123 6773 488 names
223 1090 4560 names.2
…
2 10 46
Символ конвейера действует только для команды who. Однако если вы хотите проанализировать вывод обеих команд, то можете добавить круглые скобки:
$ (wc names* ; who) | wc
983 7140 36545
Эти две команды будут выполняться как высокоприоритетные (одна за другой), но их вывод будет комбинироваться.
Например, команду sleep можно использовать для задания примитивных уведомлений:
$ (sleep 3600;echo Выключи телевизор!) &
Команда sleep n просто выполняет холостой цикл в течении n секунд (не превышающий 65535 с) и может быть полезной в сценариях командного процессора, когда нужно замедлить выводимую на экран последовательность.
Оператор () указывает, что нужно запустить порожденный shell. При выполнении команд, заключенных в скобки, не затрагивается среда родительского интерпретатора shell.
Например, чтобы запустить команду в другом каталоге, не меняя текущий каталог активного интерпретатора shell, выполните следующие команды:
Файл file.out будет создан в каталоге /export/home/user1/doc.
3.5.2. Оператор списка – фигурные скобки {}
Известно, что выходные данные последовательности команд можно объединять при помощи порожденных интерпретаторов shell. Это значит, что вместо последовательности команд:
$ date > log
$ who >> log
$ ls >> log
посредством скобок запускается порожденный интерпретатор shell:
$ (date
> who
> ls) > log
И только однажды выходные данные переадресовываются в файл log. Однако порожденный интерпретатор shell является дополнительным процессом, и на его запуск в загруженной системе тратиться какое–то время. Если все, что нужно сделать, – это переадресовать вывод (или ввод) набора команд, используйте оператор списка – фигурные скобки {}.
$ { date
> who
> ls
> } > log
Обратите внимание на пробелы и дополнительный символ возврата каретки в конце списка. Каждая команда в списке должна быть отделена от других. Можно ввести следующее:
$ { date; who; ls; } > log
Заметьте: после каждой команды стоит точка с запятой.
Между операторами запуска порожденного интерпретатора shell – () и операторами списка – {} есть следующие различия:
- в порожденном интерпретаторе shell команда cd не изменяет текущий каталог родительского интерпретатора, а оператор списка – изменяет;
- набор переменных порожденного интерпретатора shell не передается родительскому интерпретатору, а переменные из списка – передаются.
Рассмотрим примеры, сочетающие различные способы группировки.
Если введена командная строка
$ k1 && k2; k3
где k1, k2 и k3 – какие–то команды, то "k2" будет выполнена только при успешном завершении "k1"; после любого из исходов обработки "k2" (т.е. "k2" будет выполнена, либо пропущена) будет выполнена "k3".
$ k1 && {k2; k3}
Здесь обе команды ("k2" и "k3") будут выполнены только при успешном завершении "k1".
$ {k1; k2} &
В фоновом режиме будет выполняться последовательность команд "k1" и "k2".
Контрольные вопросы
1. Перечислите позиционные переменные?
2. Что такое кода завершения процесса?
3. Какие значения может принимать код завершения?
4. Какие утилиты вырабатывают только код завершения?