Слід зазначити, що підміна процесу не обмежується формою <(command), яка використовує вихід у commandвигляді файлу. Він може бути у формі, >(command)яка також подає файл як вхідний файл command. Про це також згадується у цитаті баш-посібника у відповіді @ enzotib.
У date | catнаведеному вище прикладі команда, яка використовує процес підстановки форми >(command)для досягнення того ж ефекту,
date > >(cat)
Зауважте, що >попереднє >(cat)необхідно. Знову це можна наочно проілюструвати echoяк у відповіді @ Калеба.
$ 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окрім зазначеного вище, то такої еквівалентної форми не існує, і в такому випадку немає нічого, що ми можемо використати замість підстановки процесу (звичайно, ви також можете використовувати названий файл pipe або temp, але це інша розповідь).