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