La domanda nell'attuale avviso di bontà:
l'esempio generale è troppo complicato. Qualcuno può spiegare come implementare il seguente esempio?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
sembra avere una risposta qui .
Come mostrato nella risposta di Gilles , l'idea generale è quella di inviare l'output dei comandi "producer" ai nuovi file del dispositivo 1 nelle diverse fasi di una pipeline, rendendoli disponibili per i comandi "consumer", che potrebbero eventualmente assumere i nomi dei file come argomenti ( supponendo che il tuo sistema ti dia accesso a descrittori di file come /dev/fd/X
).
Il modo più semplice per ottenere ciò che stai cercando è probabilmente:
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(Usando file1.xz
al posto di "$1"
per leggibilità e xz -cd
anziché cat ... | xz -d
perché è sufficiente un singolo comando).
L'output del primo comando "producer" xz -cd file1.xz
, viene reindirizzato a un comando composto ( {...}
); ma, invece di essere consumato immediatamente come input standard del comando successivo, viene duplicato nel descrittore di file 3
e quindi reso accessibile a tutto all'interno del comando composto come /dev/fd/3
. L'output del secondo comando "producer" xz -cd file2.xz
, che non utilizza né l'input standard né alcunché dal descrittore di file 3
, viene quindi reindirizzato al comando "consumer" diff
, che legge dal suo input standard e da /dev/fd/3
.
È possibile aggiungere duplicazioni di descrittori di file e tubazioni per fornire file di dispositivo per tutti i comandi "produttore" necessari, ad esempio:
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
Sebbene possa essere irrilevante nel contesto della tua domanda specifica, vale la pena notare che:
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
E ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
hanno diversi effetti potenziali sull'ambiente di esecuzione iniziale.
Contrariamente a quanto accade in cmd1 <(cmd2) <(cmd3)
, cmd3
e cmd1
in cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
non sarà in grado di leggere alcun input dall'utente. Ciò richiederà ulteriori descrittori di file. Ad esempio, per abbinare
diff <(echo foo) <(read var; echo "$var")
avrai bisogno di qualcosa del genere
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 Altre informazioni su di esse sono disponibili in U&L, ad es. In Informazioni / sviluppo e relativi sottodirectory e file .