Mi chiedevo come capire quanto segue:
Convogliare lo stdout di un comando nello stdin di un altro è una tecnica
potente. Ma cosa succede se è necessario reindirizzare lo stdout di più comandi
? È qui che entra in gioco la sostituzione del processo.
In altre parole, la sostituzione del processo può fare qualsiasi cosa la pipe possa fare?
Cosa può fare la sostituzione del processo, ma pipe no?
Risposta accettata:
Un buon modo per fare la differenza tra loro è fare un po' di esperimenti sulla riga di comando. Nonostante la somiglianza visiva nell'uso del <
carattere, fa qualcosa di molto diverso da un reindirizzamento o una pipe.
Usiamo la date
comando per il test.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Questo è un esempio inutile ma mostra che cat
accettato l'output di date
su STDIN e sputalo indietro. Gli stessi risultati possono essere ottenuti sostituendo il processo:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Tuttavia, quello che è appena successo dietro le quinte è stato diverso. Invece di ricevere un flusso STDIN, cat
è stato effettivamente passato il nome di un file che doveva essere aperto e letto. Puoi vedere questo passaggio usando echo
invece di cat
.
$ echo <(date)
/proc/self/fd/11
Quando cat ha ricevuto il nome del file, ha letto il contenuto del file per noi. D'altra parte, echo ci ha appena mostrato il nome del file che è stato passato. Questa differenza diventa più evidente se aggiungi più sostituzioni:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
È possibile combinare la sostituzione del processo (che genera un file) e il reindirizzamento dell'input (che collega un file a STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Sembra più o meno lo stesso, ma questa volta cat è stato passato al flusso STDIN anziché al nome di un file. Puoi vederlo provandolo con echo:
$ echo < <(date)
<blank>
Poiché echo non legge STDIN e non è stato passato alcun argomento, non otteniamo nulla.
Pipe e reindirizzamenti di input spingono il contenuto nel flusso STDIN. La sostituzione del processo esegue i comandi, salva il loro output in un file temporaneo speciale e quindi passa quel nome di file al posto del comando. Qualunque comando tu stia usando lo considera come un nome di file. Nota che il file creato non è un file normale ma una named pipe che viene rimossa automaticamente quando non è più necessaria.
Correlati:gli eventi filtrati in Process Monitor sono archiviati in memoria o su disco?