2016-07-15 102 views

risposta

12

La differenza principale è che <( ... ), chiamato "sostituzione del processo", viene tradotto dalla shell in un nome file che viene passato come argomento regolare al comando; non invia nulla allo standard input del comando. Ciò significa che esso non può essere utilizzato direttamente con comandi come tr che non tengono un argomento filename:

$ tr a-z A-Z <(echo hello) 
usage: tr [-Ccsu] string1 string2 
     tr [-Ccu] -d string1 
     tr [-Ccu] -s string1 
     tr [-Ccu] -ds string1 string2 

Tuttavia, si può sempre mettere un altro < davanti alla <( ... ) a girare in un reindirizzamento in ingresso invece:

$ tr a-z A-Z < <(echo hello) 
HELLO 

E perché genera un nome di file, è possibile utilizzare la sostituzione di processo con i comandi che richiedono più di un argomento file:

$ diff -u <(echo $'foo\nbar\nbaz') <(echo $'foo\nbaz\nzoo') 
--- /dev/fd/63 2016-07-15 14:48:52.000000000 -0400 
+++ /dev/fd/62 2016-07-15 14:48:52.000000000 -0400 
@@ -1,3 +1,3 @@ 
foo 
-bar 
baz 
+zoo 

L'altra differenza significativa è che un tubo crea subshells che non possono avere effetti collaterali nell'ambiente genitore:

$ echo hello | read x 
$ echo $x 
# nothing - x is not set 

Ma con sostituzione di processo, solo il processo all'interno delle parentesi è in una subshell; il comando circostante può ancora avere effetti collaterali:

$ read x < <(echo hello) 
$ echo $x 
hello 

la pena ricordare che si può anche scrivere in un processo con >( ... ), anche se ci sono meno casi in cui questo è utile:

$ echo hello > >(cat) 
hello 
+0

Oh, è davvero fantastico! Grazie per la risposta, che risponde perfettamente alla mia domanda. –

-4

a | b prende il stdout uscita dal eseguibile a e la immette a eseguibile b come b di stdin.

a > b prende il stdout dall'eseguibile a e reindirizza/scrive sul file b.

a < b prende il contenuto del file di b e reindirizza/ingressi ad eseguibile a come stdin

In altre parole, | tubi uscita tra programmi, mentre < e > file tubi in/out dei programmi.

La versione con () esegue un processo aggiuntivo, pur eseguendo essenzialmente la stessa cosa.

+3

No; la notazione '<(...)' non è come tu descrivi! Genera un nome di file; per reindirizzare da esso, è necessario '<<((...)' - o '>> (...)' per il reindirizzamento dell'output. –

+3

Grazie per la risposta, ma a