Подстановка процессов
Как объясняет tldp.org ,
Подстановка процессов направляет выходные данные процесса (или процессов) в стандартный поток данных другого процесса..
Таким образом, в действительности это похоже на передачу stdout одной команды в другую, например, echo foobar barfoo | wc
.Но обратите внимание: на [man-странице bash] [3] вы увидите, что она обозначена как <(list)
.Таким образом, в основном вы можете перенаправить вывод нескольких (!) Команд.
Примечание: технически, когда вы говорите <<, вы ссылаетесь не на одну вещь, а на два перенаправления с одним <и обрабатывает перенаправление вывода из <(...). </p>
А что будет, если мы просто обработаем подстановку?
$ echo <(echo bar)
/dev/fd/63
Как вы можете видеть, оболочка создает временный файловый дескриптор /dev/fd/63
, куда выводятся данные.Это означает, что <
перенаправляет этот файловый дескриптор как ввод в команду.
Очень простой пример - сделать подстановку процесса вывода двух команд echo в wc:
$ wc < <(echo bar;echo foo)
2 2 8
здесь мы создаем оболочку, создаем файловый дескриптор для всего вывода, который происходит в круглых скобках, и перенаправляем его в качестве ввода в wc. Как и ожидалось, wc получает этот поток от двух команд echo, которые сами выводят две строки, каждая из которых имеет слово,и соответственно у нас есть 2 слова, 2 строки и 6 символов плюс две новые строки.
Примечание для стороны : Подстановка процесса может упоминаться как bashism (команда или структура, используемая в расширенномон похож на bash, но не указан в POSIX), но он был реализован в ksh до существования bash как ksh man page .Однако такие оболочки, как tcsh
и mksh
, не имеют подстановки процессов.Итак, как мы могли бы перенаправить вывод нескольких команд в другую команду без подстановки процесса?Группировка плюс трубопровод!
$ (echo foo;echo bar) | wc
2 2 8
По сути, это то же самое, что и в предыдущем примере. Однако это отличается от замены процесса под капотом, так как мы делаем стандартный вывод всей подоболочки и стандартный вывод wc
[связанныйс трубой] [5].С другой стороны, подстановка процесса заставляет команду прочитать временный дескриптор файла.
Итак, если мы можем выполнить группировку с помощью конвейера, зачем нам подстановка процесса?Потому что иногда мы не можем использовать трубопровод.Рассмотрим приведенный ниже пример - сравнение выходных данных двух команд с diff
(для которого нужны два файла, и в этом случае мы даем ему два файловых дескриптора)
diff <(ls /bin) <(ls /usr/bin)