Questo si chiama sostituzione del processo.
3.5.6 Sostituzione del processo
La sostituzione del processo consente di fare riferimento all'input o all'output di un processo utilizzando un nome file.
L'elenco dei processi viene eseguito in modo asincrono e il relativo input o output viene visualizzato come nome file. Questo nome file viene passato come argomento al comando corrente come risultato dell'espansione. Se viene utilizzata la forma>(lista), la scrittura nel file fornirà l'input per la lista. Se viene utilizzata la forma <(list), il file passato come argomento deve essere letto per ottenere l'output di list. Si noti che non può comparire alcuno spazio tra
e la parentesi aperta, altrimenti il costrutto verrebbe interpretato come un reindirizzamento. La sostituzione del processo è supportata sui sistemi che supportano le pipe denominate (FIFO) o il metodo /dev/fd per denominare i file aperti.
Non è solo una bash come appariva originariamente in ksh ma non è nello standard posix.
Sotto il cofano, la sostituzione dei processi ha due implementazioni. Sui sistemi che supportano
/dev/fd
(la maggior parte dei sistemi simili a Unix) funziona chiamando ilpipe(
) chiamata di sistema, che restituisce un descrittore di file$fd
per una nuova pipe anonima, quindi creando la stringa/dev/fd/$fd
e lo sostituisce nella riga di comando. Sui sistemi senza/dev/fd
support, chiamamkfifo
con un nuovo nome file temporaneo per creare una named pipe e sostituisce questo nome file nella riga di comando.
Puoi pensare a <( somecommand )
come nome file di un file temporaneo contenente l'output di somecommand
. In altre parole,
utility < <( somecommand )
è una scorciatoia per
somecommand >tempfile
utility <tempfile
rm -f tempfile
E
utility <( somecommand )
è una scorciatoia per
somecommand >tempfile
utility tempfile # notice the lack of redirection here (utility expected to read from "tempfile")
rm -f tempfile
Allo stesso modo >( somecommand )
può essere pensato come il nome file di un file temporaneo che verrà inserito in somecommand
sul suo input standard. In altre parole,
utility > >( somecommand )
è una scorciatoia per
utility >tempfile
somecommand <tempfile
rm -f tempfile
E
utility >( somecommand )
potrebbe essere una scorciatoia per
mkfifo temppipe
somecommand <temppipe &
utility temppipe # utility is expected to write to "temppipe"
rm -f temppipe
(o qualcosa di simile)