Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы OC UNIX_часть3.doc
Скачиваний:
21
Добавлен:
18.04.2015
Размер:
543.23 Кб
Скачать

3.5.1. Порожденный shell – оператор круглые скобки ( )

Круглые скобки (), кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора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, выполните следующие команды:

$ pwd

/export/home/user1

$ (cd /export/home /user1/doc ; sort file1 > file.out) &

$ pwd

/export/home/user1

Файл 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".