Следует отметить, что процесс подстановки не ограничивается формой <(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.shIS
#!/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кроме того, что упомянуто выше, то такой эквивалентной формы не существует, и в этом случае мы ничего не можем использовать вместо подстановки процесса (конечно, вы также можете использовать именованный канал или временный файл, но это другое сказка).