<Предыдущая | Содержание: | Следующая>
Замена процесса
Хотя они выглядят одинаково и оба могут использоваться для объединения потоков для перенаправления, существует важное различие между групповыми командами и подоболочками. В то время как групповая команда выполняет все свои команды в текущей оболочке, подоболочка (как следует из названия) выполняет свои команды в дочерней копии текущей оболочки. Это означает, что окружение копируется и передается новому экземпляру оболочки. При выходе из подоболочки копия среды теряется, поэтому любые изменения, внесенные в среду подоболочки (включая присвоение переменных), также теряются. Поэтому в большинстве случаев, если для сценария не требуется подоболочка, групповые команды предпочтительнее подоболочки. Групповые команды выполняются быстрее и требуют меньше памяти.
Мы видели пример проблемы среды подоболочки в главе 28, когда обнаружили, что читать команда в конвейере работает не так, как мы могли бы интуитивно ожидать. Напомним, если мы построим конвейер следующим образом:
эхо "фу" | читать эхо $ REPLY
эхо "фу" | читать эхо $ REPLY
Содержание оТВЕТИТЬ переменная всегда пуста, потому что читать команда выполняется в подоболочке, а ее копия оТВЕТИТЬ уничтожается при завершении подоболочки.
Поскольку команды в конвейерах всегда выполняются в подоболочках, любая команда, назначающая переменные, столкнется с этой проблемой. К счастью, оболочка обеспечивает экзотическую форму расширения, называемую процесс замены это можно использовать для решения этой проблемы.
Замещение процесса выражается двумя способами: Для процессов, производящих стандартный вывод:
<(список)
или для процессов, которые принимают стандартный ввод:
>(список)
в котором список это список команд.
Чтобы решить нашу проблему с читать, мы можем использовать замену процесса следующим образом:
читать <<(echo "foo") echo $ REPLY
читать <<(echo "foo") echo $ REPLY
Подстановка процесса позволяет нам обрабатывать вывод подоболочки как обычный файл с целью перенаправления. Фактически, поскольку это форма расширения, мы можем проверить его реальную ценность:
[я @ linuxbox ~] $ echo <(echo "foo")
/ dev / fd / 63
[я @ linuxbox ~] $ echo <(echo "foo")
/ dev / fd / 63
Работая с эхо чтобы просмотреть результат расширения, мы видим, что вывод подоболочки обеспечивается файлом с именем / dev / fd / 63.
Замена процесса часто используется с циклами, содержащими читать. Вот пример
цикл чтения, обрабатывающий содержимое списка каталогов, созданного подоболочкой:
#! / Bin / Баш
# pro-sub: демонстрация подстановки процесса
при чтении ссылок attr владелец группы размер дата время имя файла; do cat << - EOF
Имя файла: $ filename Размер: $ size
Владелец: $ owner
Группа: $ group Изменено: $ date $ time Links: $ links Атрибуты: $ attr
EOF
сделано <<(ls -l | tail -n +2)
#! / Bin / Баш
# pro-sub: демонстрация подстановки процесса
при чтении ссылок attr владелец группы размер дата время имя файла; do cat << - EOF
Имя файла: $ filename Размер: $ size
Владелец: $ owner
Группа: $ group Изменено: $ date $ time Links: $ links Атрибуты: $ attr
EOF
сделано <<(ls -l | tail -n +2)
Цикл выполняется читать для каждой строки списка каталогов. Сам листинг создается в последней строке скрипта. Эта строка перенаправляет вывод подстановки процесса на стандартный ввод цикла. В хвост Команда включена в конвейер подстановки процесса для удаления первой строки листинга, в которой нет необходимости.
При выполнении сценарий производит следующий вывод:
[я @ linuxbox ~] $ pro-sub | голова -n 20
Имя файла: address.ldif Размер: 14540
Владелец: я
Группа: я
Modified: 2009-04-02 11:12
[я @ linuxbox ~] $ pro-sub | голова -n 20
Имя файла: address.ldif Размер: 14540
Владелец: я
Группа: я
Modified: 2009-04-02 11:12
Ссылки:
1
Ссылки:
Атрибуты: -rw-r - r--
Имя файла: bin
Размер: 4096
Владелец: я
Группа: я
Modified: 2009-07-10 07:31
Ссылки: 2
Атрибуты: drwxr-xr-x
Имя файла: bookmarks.html Размер: 394213
Владелец: я
Группа: я
Атрибуты: -rw-r - r--
Имя файла: bin
Размер: 4096
Владелец: я
Группа: я
Modified: 2009-07-10 07:31
Ссылки: 2
Атрибуты: drwxr-xr-x
Имя файла: bookmarks.html Размер: 394213
Владелец: я
Группа: я