Слід зазначити, що підміна процесу не обмежується формою <(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, але це інша розповідь).