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

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

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

 Стандартный ввод/вывод

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

 файл "стандартного" ввода

 файл "стандартного" вывода

 файл "диагностического" вывода (файл ошибок)
Каждому из этих файлов соответствует число, называемое дескриптором файла. Принято, что дескриптор 0 соответствует стандартному вводу, 1 - стандартному выводу и дескриптор 2 - диагностическому выводу. Процессы-потомки, как правило, берут эти файлы из "родительского" процесса. Первоначально все три файла подключены к терминалу (0 - к клавиатуре, 1 и 2 - к экрану). Интерпретатор команд Shell позволяет перенаправлять файлы до того, как управление будет передано вызванной команде.
Аргументы для интерпретатора, записанные в форме <file или >file, открывают файлы с указанными именами в качестве устройств стандартного ввода или вывода (в случае вывода старое содержимое файла с указанным именем, если он существовал ранее, будет уничтожено). Аргумент, записанный в виде >>file, направляет стандартный вывод в конец файла, тем самым давая возможность добавлять данные к уже существующему файлу, не разрушая его содержимого. В последних двух случаях Shell создает файл с указанным именем, если он не существовал до этого. Таким образом, команда:

> output

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

who >> log

В аргументах команд, перенаправляющих ввод-вывод, не производится интерпретация пробелов и поиск файлов по шаблонам. Это означает, что команда:

echo 'this is a test' > *.gal

создает файл с именем *.gal, содержащий одну строку. В случае, если вы, например, дадите команду:

cat <?

то будет выдано сообщение об ошибке, если у вас нет файла с именем?.
Значение специальных символов не распространяется на аргументы, перенаправляющие ввод-вывод, т.к. они просматриваются интерпретатором до проведения операций распознавания шаблонов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: