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
fonte
2016-07-15 18:44:40
Oh, è davvero fantastico! Grazie per la risposta, che risponde perfettamente alla mia domanda. –