- •И.Н.Акуленок
- •Утверждено советом университета
- •Введение
- •Глава 1. Текстовые редакторы
- •1.1. Редактор ed
- •1.1.1. Команды, не использующие адресации строк
- •1.1.2. Команды, использующие один адрес
- •1.1.3. Команды, использующие два адреса
- •1.1.4. Нумерация строк
- •1.1.5. Примеры использования команд
- •1.2. Редактор VI и ex
- •1.2.1. Редактирование нескольких файлов
- •1.2.2. Вставка текста из одного файла в другой
- •1.3. Потоковый редактор sed
- •1.4. Контрольные вопросы
- •Глава 2. Командные процессоры ос unix
- •2.1. Типы командных процессоров
- •2.2. Идентификация и смена оболочки
- •2.3. Запуск shell и стартовых shell–файлов
- •2.4. Установка переменных среды
- •2.5. Псевдонимы команд
- •2.6. Выполнение .Profile после его изменения
- •2.7. Контрольные вопросы
- •Глава 3. Интерпретатор shell
- •3.1. Shell–переменные
- •3.1.1. Задание значений переменных и их отмена
- •3.1.2. Экспорт переменных
- •3.2. Специальные символы
- •3.2.1. Использование двойных кавычек и апострофа
- •3.2.2. Обратные апострофы
- •3.2.3. Обратная наклонная черта
- •3.3. Позиционные переменные
- •3.4. Код завершения процесса
- •3.5. Конвейеры и списки
- •3.6. Композиции команд
- •3.5.1. Порожденный shell – оператор круглые скобки ( )
- •3.5.2. Оператор списка – фигурные скобки {}
- •3.6. Контрольные вопросы
- •Глава 4. Программные структуры
- •4.1. Команда test
- •4.1.1. Условия проверки файлов
- •4.1.2. Условия проверки строк
- •4.1.3. Условия сравнения целых чисел
- •4.1.4. Сложные условия
- •4.2. Команда expr
- •4.3. Команда read
- •4.4.Условный оператор if
- •4.5. Оператор цикла for
- •4.6. Операторы цикла while и until
- •4.7. Оператор вызова case
- •4.8. Функции в shell
- •4.9. Контрольные вопросы
- •5. Создание сценария командного процессора
- •5.1. Пример простейшего сценария
- •5.2. Основные этапы разработки сценария
- •5.3. Отладка командных процедур
- •5.4. Выполнение shell–программ
- •5.5. Создание новых команд
- •5.6. Контрольные вопросы
- •Список литературы
- •Оглавление
- •Акуленок Ирина Николаевна
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".