Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен UNIX.docx
Скачиваний:
31
Добавлен:
11.06.2015
Размер:
532 Кб
Скачать
☆

Управление потоком выполнения

   Shell имеет несколько команд, которые используют множество управляющих структур, полезных при управлении потоком выполнения процедур. Перед тем как описывать эти структуры, необходимо определить некоторые термины.    Простая команда - это любая неделимая команда, определяемая именем выполняемого файла. Аргументы переадресации ввода-вывода могут указываться в простых командах и они передаются интерпретатору, а не самой команде.    Команда - это простая команда или любая из управляющих команд Shell, описанных ниже. Конвейер - это последовательность из одной или более команд, разделенных вертикальными чертами (|). В конвейере стандартный вывод каждой команды,  кроме последней, соединен посредством программного канала со стандартным вводом следующей команды. Каждая   команда в конвейере выполняется отдельно; Shell ждет завершения последней команды. Код завершения конвейера равен коду завершения последнего процесса в конвейере.    Список команд - это последовательность из  одного  или  более конвейеров, разделенных  точками с запятой (;), амперсандами (&), символами "и-если" (&&)  или "или-если" (||)   и  заканчивающаяся (необязательно) точкой с запятой или амперсандом. Точка с запятой вызывает последовательное выполнение предыдущего конвейера. Это значит, что  Shell ждет конца выполнения конвейера и только после этого считывает следующий. С другой стороны, амперсанд вызывает асинхронное выполнение   в  фоновом режиме предыдущего конвейера. Таким образом допускаются как последовательное, так и фоновое выполнение. Фоновый конвейер продолжает выполнение до тех пор, пока не завершится самостоятельно или будет уничтожен.    Другие области  применения амперсанда включают в себя фоновую компиляцию и создание заданий, которые будут пересылаться другим компьютерам. Допустим, вы ввели:

nohup cc prog.c&

   Вы можете продолжать работать в то время как Си-компилятор выполняется в фоновом режиме. Командная строка, заканчивающаяся амперсандом, защищена от прерываний и выхода, которые вы указываете, набирая с клавиатуры INTERRUPT или QUIT. Только одновременное нажатие клавиш Ctrl-d может снять команду в случае, если вы работаете через коммутируемую линию или имеете stty hupcl. В этом случае мы также советуем устанавливать защиту от прерываний. Для этого используется команда nohup. Допустим, что в  приведенном примере вы не указали nohup, тогда если вы выходите из подзадачи до того, как завершится процесс сс, он будет уничтожен со всем своим выводом.    Амперсанд нужно применять с ограничениями,  особенно в сильно загруженных системах. В противном случае возникнут претензии со стороны других пользователей, если вы будете запускать много процессов в фоновом режиме без достаточных на то оснований.    Операторы "и-если" и "или-если" (&& и ||) вызывают выполнение конвейеров при соответствии определенных условий.  Оба эти оператора имеют одинаковый приоритет при расшифровке командной строки, но меньший,  чем  у амперсанда и вертикальной черты.  В командной строке:

cmd1 || cmd2

первая команда cmd1 выполняется и анализируется ее  код  завершения. Команда cmd2 выполняется только в том случае, если сmd1 завершилась с кодом, не равным 0. Т.е. это является краткой записью следующих команд:

if cmd1

test $? !=0

then

cmd2

fi

   Оператор "и-если" (&&) выполняет проверку на равенство. Например, в командной строке:

cmd1 && cmd2

вторая команда выполняется только в том случае, если первая завершилась успешно (код завершения равен 0). В следующей строке каждая команда выполняется по очереди до тех пор,  пока какая-нибудь не закончится с кодом, не равным 0:

cmd1 && cmd2 && cmd3 && ... && cmdn

   Простая команда в конвейере может быть заменена списком команд, заключенным в простые или фигурные скобки. Вывод всех команд, заключенных в скобки, объединяется в один поток, который становится входом для следующей команды в  конвейере. Следующая командная строка форматирует и печатает два отдельных документа:

{ nroff -mm text1; nroff -mm text2; } | lpr

   Обратите внимание на то, что после левой скобки необходим пробел, а перед правой должна стоять точка с запятой.