Va notato che la sostituzione del processo non è limitata al modulo <(command), che utilizza l'output di commandcome file. Può essere nella forma >(command)che alimenta anche un file come input command. Questo è anche menzionato nella citazione del manuale di bash nella risposta di @ enzotib.
Per l' date | catesempio di cui sopra, un comando che utilizza la sostituzione processo di forma >(command)per ottenere lo stesso effetto sarebbe,
date > >(cat)
Si noti che >prima >(cat)è necessario. Questo può essere nuovamente illustrato chiaramente echocome nella risposta di @ Caleb.
$ echo >(cat)
/dev/fd/63
Quindi, senza extra >, date >(cat)sarebbe lo stesso date /dev/fd/63che stamperà un messaggio a stderr.
Supponiamo di avere un programma che accetta solo nomi di file come parametri e che non elabora stdino stdout. Userò lo script semplificato psub.shper illustrare questo. Il contenuto di psub.shè
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Fondamentalmente, verifica che entrambe le argomentazioni sono file (file non necessariamente regolari) e se questo è il caso, scrivere il primo campo di ogni riga di "$1"per "$2"usare awk. Quindi, un comando che combina tutto quanto menzionato finora è,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Questo stamperà
a
b
c
ed è equivalente a
printf "a a\nc c\nb b" | awk '{print $1}' | sort
ma quanto segue non funzionerà e qui dobbiamo usare la sostituzione del processo,
printf "a a\nc c\nb b" | ./psub.sh | sort
o la sua forma equivalente
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Se ./psub.shsi legge anche stdinoltre a quanto menzionato sopra, allora non esiste un modulo simile e in tal caso non c'è nulla che possiamo usare al posto della sostituzione del processo (ovviamente puoi anche usare un pipe chiamato o un file temporaneo, ma questo è un altro storia).