Va notato che la sostituzione del processo non è limitata al modulo <(command)
, che utilizza l'output di command
come 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 | cat
esempio 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 echo
come nella risposta di @ Caleb.
$ echo >(cat)
/dev/fd/63
Quindi, senza extra >
, date >(cat)
sarebbe lo stesso date /dev/fd/63
che stamperà un messaggio a stderr.
Supponiamo di avere un programma che accetta solo nomi di file come parametri e che non elabora stdin
o stdout
. Userò lo script semplificato psub.sh
per 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.sh
si legge anche stdin
oltre 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).