Выбрать главу

5.10. Заключение

В процессе чтения книги вы встретите множество примеров переадресации. Механизм переадресации является важной частью интерпретатора shell, так как позволяет соединять команды с выходными и входными файлами, а также разделять потоки вывода и ошибок.

ГЛАВА 6

Порядок выполнения команд

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

В этой главе рассматриваются следующие темы: в выполнение команды в зависимости от результата выполнения другой команды; в группирование команд.

Интерпретатор shell располагает операторами && и, которые группируют команды по принципу логического И/ИЛИ. Существуют также операторы () и {}, объединяющие заключенные в них команды в группу, выполняемую в текущем или порожденном интерпретаторе shell.

6.1. Оператор &&

Общий формат оператора && таков:

команда1 && команда2

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

Рассмотрим простой пример:

$ cp justice.doc justice.bak && echo "копирование прошло успешно"

копирование прошло успешно

Сообщение, заданное в команде echo, появилось на экране, значит, команда cp успешно выполнила копирование файла. А вот более практичный пример:

$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin

Каталог /apps/biп с помощью команды mv перемешается в каталог /apps/dev/bin. Если перемещение завершится удачно, то исходный каталог - /apps/biп — будет удален.

В следующем примере команда sort сортирует содержимое текстового файла quarter_end.txt, записывая результат в файл quarter, sorted. Если запись прошла успешно, полученный файл выводится на печать с помощью команды lp.

$ sort quarter_end.txt > quarter.sorted && lp quarter. sorted

6.2. Оператор ||

Рассмотрим общий формат оператора | |:

команда1 || команда2

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

Приведем простой пример, иллюстрирующий применение оператора | |:

$ cp wopper.txt oops.txt || echo "копирование не выполнено"

cp: wopper.txt: No such file or directory копирование не выполнено

Операция копирования завершилась неудачно (исходного файла не существует), поэтому была выполнена команда echo.

В следующем примере из файла acc.qtr извлекаются первое и пятое поля, а результат помещается во временный файл qtr.tmp. Если по какой‑то причине извлечь нужные данные не удастся, пользователь dave получит электронное сообщение.

$ awk ' {print$1,$5}' acc.qtr > qtr.tmp || echo "Получить данные не удалось." | \

mail dave

6.3. Группирование команд с помощью скобок

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

Для выполнения группы команд в текущем интерпретаторе shell следует заключить их список в фигурные скобки, разделив команды точкой с запятой:

{команда1; команда2; …}

Чтобы выполнить группу команд в порожденном интерпретаторе shell, поступите аналогичным образом, но вместо фигурных скобок поставьте круглые скобки:

(команда1; команда2; …)

Сам по себе подобный метод применяется не часто. Обычно группа команд выполняется в составе более крупных конструкций с операторами && или. Результатом работы группы команд считается результат выполнения последней команды в группе.

Предположим, я выполняю сценарий comet, обрабатывающий файл month_end.txt, и в случае неудачного завершения сценария хочу прекратить работу интерпретатора shell. Простейший способ сделать это состоит в следующем:

$ comet month_end.txt || exit

Но можно также перед выходом из интерпретатора послать отвечающему за этот сценарий пользователю электронное сообщение:

$ comet month_end.txt || (echo "Привет! Твой сценарий не работает." | \

mail dave; exit)

Символ '\' в конце первой строки означает, что команда будет продолжена в следующей строке.

Вспомним рассмотренный ранее пример, в котором команда sort сортирует содержимое текстового файла quarter_end.txt, записывая результат в файл quarter.sorted с последующим выводом его на печать:

$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted

Применив метод группировки команд, можно одновременно с печатью файла скопировать его в каталог /logs.

$ sort quarter_end.txt > quarter.sorted && \

(cp quarter.sorted /logs/quarter.sorted; lp quarter.sorted)