Вход/Регистрация
Командная строка Linux
вернуться

Шоттс Уильям

Шрифт:

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

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

<(список)

и для процессов, принимающих данные через стандартный ввод:

>(список)

где список — это список команд.

Ниже показано, как использовать подстановку процессов для решения проблемы с командой read:

read < <(echo "foo")

echo $REPLY

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

[me@linuxbox ~]$ echo <(echo "foo")

/dev/fd/63

Вывод результата подстановки командой echo показывает, что вывод подоболочки передается через файл с именем /dev/fd/63.

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

#!/bin/bash

# pro-sub : демонстрация подстановки процессов

while read attr links owner group size date time filename; do

cat <<- EOF

Filename: $filename

Size: $size

Owner: $owner

Group: $group

Modified: $date $time

Links: $links

Attributes: $attr

EOF

done < <(ls -l | tail -n +2)

Цикл выполняет read для каждой строки в списке с содержимым каталога. Сам список создается последней строкой в сценарии. Здесь вывод подоболочки перенаправляется на стандартный ввод цикла с помощью подстановки процесса. Коман­да tail включена в конвейер, чтобы устранить первую строку в списке, которая не нужна.

Этот сценарий выведет примерно следующее:

[me@linuxbox ~]$ pro_sub | head -n 20

Filename: addresses.ldif

Size: 14540

Owner: me

Group: me

Modified: 2012-04-02 11:12

Links: 1

Attributes: -rw-r--r--

Filename: bin

Size: 4096

Owner: me

Group: me

Modified: 2012-07-10 07:31

Links: 2

Attributes: drwxr-xr-x

Filename: bookmarks.html

Size: 394213

Owner: me

Group: me

Ловушки

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

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

Для этой цели в bash поддерживается механизм, известный как ловушка (trap). Ловушки реализуются с применением встроенной команды с соответствующим именем trap. Команда trap имеет следующий синтаксис:

trap аргумент сигнал [сигнал...]

где аргумент — это строка, которая будет прочитана и выполнена как команда, а сигнал — идентификатор сигнала, в ответ на который будет выполнена указанная команда.

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

#!/bin/bash

# trap-demo : простой пример обработки сигналов

trap "echo 'I am ignoring you.'" SIGINT SIGTERM

for i in {1..5}; do

echo "Iteration $i of 5"

sleep 5

done

Этот сценарий определяет ловушку, которая будет выполнять команду echo в ответ на сигналы SIGINT и SIGTERM, получаемые сценарием во время выполнения. Ниже показано, как выглядят попытки остановить сценарий нажатием комбинации CTRL+C:

  • Читать дальше
  • 1
  • ...
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: