Книга: Искусство программирования на языке сценариев командной оболочки
Глава 21. Подстановка процессов
Глава 21. Подстановка процессов
Подстановка процессов -- это аналог подстановки команд. Операция подстановки команд записывает в переменную результат выполнения некоторой команды, например, dir_contents=`ls -al` или xref=$(grep word datafile). Операция подстановки процессов передает вывод одного процесса на ввод другого (другими словами, передает результат выполнения одной команды -- другой).
Шаблон подстановки команды
Внутри круглых скобок
>(command)
<(command)
Таким образом инициируется подстановка процессов. Здесь, для передачи результата работы процесса в круглых скобках, используются файлы /dev/fd/<n>.[ 49 ]
bash$ echo >(true)
/dev/fd/63
bash$ echo <(true)
/dev/fd/63
Bash создает канал с двумя файловыми дескрипторами, --fIn и fOut--. stdin команды true присоединяется к fOut (dup2(fOut, 0)), затем Bash передает /dev/fd/fIn в качестве аргумента команде echo. В системах, где отсутствуют файлы /dev/fd/<n>, Bash может использовать временные файлы. (Спасибо S.C.)
cat <(ls -l)
# То же самое, что и ls -l | cat
sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)
# Список файлов в трех основных каталогах 'bin', отсортированный по именам файлов.
# Обратите внимание: на вход 'sort' поданы три самостоятельные команды.
diff <(command1) <(command2) # Выдаст различия в выводе команд.
tar cf >(bzip2 -c > file.tar.bz2) $directory_name
# Вызовет "tar cf /dev/fd/?? $directory_name" и затем "bzip2 -c > file.tar.bz2".
#
# Из-за особенностей, присущих некоторым системам, связанным с /dev/fd/<n>,
# канал между командами не обязательно должен быть именованным.
#
# Это можно сделать и так.
#
bzip2 -c < pipe > file.tar.bz2&
tar cf pipe $directory_name
rm pipe
# или
exec 3>&1
tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&-
exec 3>&-
# Спасибо S.C.
Ниже приводится еще один очень интересный пример использования подстановки процессов.
# Фрагмент сценария из дистрибутива SuSE:
while read des what mask iface; do
# Некоторые команды ...
done < <(route -n)
# Чтобы проверить это, попробуем вставить команду, выполняющую какие либо действия.
while read des what mask iface; do
echo $des $what $mask $iface
done < <(route -n)
# Вывод на экран:
# Kernel IP routing table
# Destination Gateway Genmask Flags Metric Ref Use Iface
# 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
# Как указывает S.C. -- более простой для понимания эквивалент:
route -n |
while read des what mask iface; do # Переменные берут значения с устройства вывода конвейера (канала).
echo $des $what $mask $iface
done # На экран выводится то же самое, что и выше.
# Однако, Ulrich Gayer отметил, что ...
#+ этот вариант запускает цикл while в подоболочке,
#+ и поэтому переменные не видны за пределами цикла, после закрытия канала.
- Глава 18. Регулярные выражения
- Глава 19. Подоболочки, или Subshells
- Глава 20. Ограниченный режим командной оболочки
- Глава 21. Подстановка процессов
- Глава 22. Функции
- 22.1. Сложные функции и сложности с функциями
- Глава 23. Псевдонимы
- Глава 24. Списки команд
- Глава 25. Массивы
- Глава 26. Файлы
- Глава 27. /dev и /proc
- Глава 28. /dev/zero и /dev/null
- Глава 29. Отладка сценариев
- Глава 30. Необязательные параметры (ключи)
- Глава 31. Широко распространенные ошибки
- Глава 32. Стиль программирования
- Глава 33. Разное
- Глава 34. Bash, версия 2
- Глава 35. Замечания и дополнения
- Глава 7 Чего нужно опасаться при моделировании бизнес-процессов. Проектные риски моделирования бизнеспроцессов
- Эффективное взаимодействие процессов архитектуры Classic Server
- 1.2. Понятие информации. Общая характеристика процессов сбора, передачи, обработки и накопления информации
- 3.4.2. Остановка процессов
- 3.4.3. Просмотр процессов
- Лекция 16. Взаимодействие процессов
- 1.1.3. Уязвимости процессов накопления знаний (самообучения)
- 3.2. Создание процессов
- 3.3.2. Оценка информационной безопасности на основе модели зрелости процессов
- ГЛАВА 1 Обзор средств взаимодействия процессов Unix
- Планирование процессов управления контентом
- 5.4.2. Взаимодействие родительского и дочернего процессов