Crayons Assorted 34
Pencils Light 12
Ниже показаны результаты работы сценария:
$ f_desc
Crayons Assorted 34
Pencils Light 12
В следующих главах мы рассмотрим более сложные примеры работы с дескрипторами файлов. В частности, будет показано, как с их помощью копировать текстовые файлы, не пользуясь командой cp.
5.10. Заключение
В процессе чтения книги вы встретите множество примеров переадресации. Механизм переадресации является важной частью интерпретатора shell, так как позволяет соединять команды с выходными и входными файлами, а также разделять потоки вывода и ошибок.
Порядок выполнения команд
При выполнении команды иногда требуется знать, как была выполнена другая команда. Предположим, необходимо скопировать все файлы из одного каталога в другой, а затем удалить исходный каталог. Прежде чем удалять исходный каталог, важно убедиться, что копирование прошло успешно. В противном случае содержимое исходного каталога может оказаться утерянным.
В этой главе рассматриваются следующие темы: в выполнение команды в зависимости от результата выполнения другой команды; в группирование команд.
Интерпретатор 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; …)
Сам по себе подобный метод применяется не часто. Обычно группа команд выполняется в составе более крупных конструкций с операторами && или. Результатом работы группы команд считается результат выполнения последней команды в группе.