Следует отметить, что подстановка процесса не ограничивается формой <(command)
, которая использует выходные данные command
в виде файла. Это может быть форма >(command)
, которая также подает файл в качестве входных данных для command
. Это также упоминается в цитате руководства bash в ответе @enzotib.
Для приведенного выше примера date | cat
команда, использующая подстановку процесса формы >(command)
для достижения того же эффекта, будет
date > >(cat)
Обратите внимание, что >
перед >(cat)
необходимо. Это снова можно ясно проиллюстрировать echo
, как в ответе @Caleb.
$ echo >(cat)
/dev/fd/63
Таким образом, без дополнительного >
date >(cat)
будет таким же, как date /dev/fd/63
, которое напечатает сообщение в stderr.
Предположим, у вас есть программа, которая принимает в качестве параметров только имена файлов и не обрабатывает stdin
или stdout
. Я буду использовать упрощенный сценарий psub.sh
, чтобы проиллюстрировать это. Содержимое psub.sh
—
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
По сути, он проверяет, что оба его аргумента являются файлами (, не обязательно обычными файлами ), и если это так, записывает первое поле каждой строки "$1"
в "$2"
с помощью awk. Затем команда, которая сочетает в себе все, что упоминалось до сих пор,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Будет напечатано
a
b
c
и эквивалентно
printf "a a\nc c\nb b" | awk '{print $1}' | sort
но следующее не будет работать, и мы должны использовать подстановку процесса здесь,
printf "a a\nc c\nb b" |./psub.sh | sort
или эквивалентная форма
printf "a a\nc c\nb b" |./psub.sh /dev/stdin /dev/stdout | sort
Если ./psub.sh
также читается как stdin
помимо упомянутого выше, то такой эквивалентной формы не существует, и в таком случае мы ничего не можем использовать вместо подстановки процесса (конечно можно и использовать именованный канал или временный файл, но это уже другая история ).