Теперь Вы знаете, что подстановка процессов (process substitution) позволяет сделать так, чтобы вывод команды выглядел как файл для чтения — с помощью конструкции <(command). Однако подстановку процессов можно использовать и для записи в команды. Вы уже видели, как с помощью tee можно продублировать данные в два файла:
hacker@piping:~$ echo HACK | tee THE > PLANET
hacker@piping:~$ cat THE
HACK
hacker@piping:~$ cat PLANET
HACK
hacker@piping:~$
И как использовать tee для дублирования данных в файл и в команду:
hacker@piping:~$ echo HACK | tee THE | cat
HACK
hacker@piping:~$ cat THE
HACK
hacker@piping:~$
Но как быть, если нужно продублировать вывод сразу в две команды? Согласно справке tee (man‑странице), эта утилита предназначена для записи в файлы и стандартный вывод:
TEE(1) User Commands TEE(1)
НАЗВАНИЕ
tee - считывает данные из стандартного устройства ввода и записывает
их на стандартное устройство вывода или в файл
Но подождите! Вы только что узнали, что bash может «превращать» команды в каналы, похожие на файлы, с помощью подстановки процессов. Для записи в команду (output process substitution) используется форма >(command).
Если указать аргумент >(rev), bash запустит команду rev (эта команда читает данные из стандартного ввода, переворачивает их и пишет в стандартный вывод), а её стандартный ввод подключит к временному именованному каналу. Когда другие команды записывают данные в этот «файл», они фактически попадают в стандартный ввод команды:
hacker@piping:~$ echo HACK | rev
KCAH
hacker@piping:~$ echo HACK | tee >(rev)
HACK
KCAH
В приведённом выше примере происходит следующее:
bash запускает команду rev, подключая именованный канал (предположительно /dev/fd/63) к стандартному вводу rev.
bash запускает команду tee, подключая к её стандартному вводу канал и подставляя вместо первого аргумента >(rev) путь /dev/fd/63. Команда tee никогда не видит аргумент >(rev) — оболочка подставляет вместо него имя файла до запуска tee.
bash выполняет встроенную команду echo, записывая HACK в стандартный ввод tee.
tee считывает HACK, выводит его в стандартный вывод и записывает его в /dev/fd/63 (который подключён к стандартному вводу rev).
rev считывает HACK из стандартного ввода, переворачивает его и выводит KCAH в стандартный вывод.
Теперь Ваша очередь.
В этом задании Вам даны команды /challenge/hack, /challenge/the и /challenge/planet. Запустите /challenge/hack и продублируйте её вывод в качестве входа сразу для двух команд: /challenge/the и /challenge/planet. При необходимости перечитайте прошлые задания данного модуля, чтобы освежить в памяти, как комбинировать tee и подстановку процессов.
ПРИМЕЧАНИЕ:
Внимательный читатель заметит, что следующее варианты эквивалентны:
hacker@piping:~$ echo hi | rev
ih
hacker@piping:~$ echo hi > >(rev)
ih
hacker@piping:~$
Существует более одного способа «прокачать» данные через команду. Разумеется, второй способ гораздо труднее читать и расширять. Например:
hacker@piping:~$ echo hi | rev | rev
hi
hacker@piping:~$ echo hi > >(rev | rev)
hi
hacker@piping:~$
Вариант echo hi > >(rev | rev) выглядит откровенно громоздко. Вывод: хотя подстановка процессов — мощный инструмент в Вашем арсенале, это очень специализированный инструмент, и использовать его стоит только там, где он действительно уместен, а не во всех случаях подряд.