Due pipe per un comando


9

Sono un po 'confuso dalla seguente sintassi. Sebbene funzioni, non capisce perché funzioni. Sembra che ci siano due pipe collegate al comando diff. Ma non ce n'è solo uno STDIN?

Esempi:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

Ecco un link all'argomento pertinente - sostituzione del processo - nella bashpagina man.
Chepner,

Risposte:


13

Le pipe sono semplicemente associate a descrittori di file diversi da 0 (stdin):

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

Un processo può ovviamente avere più di un descrittore di file aperto alla volta, quindi non ci sono problemi.


Se solo avessi saputo che si chiamava pipe temporanee, avrei potuto cercarlo su Google. Grazie!

@iblue: non credo si chiami "pipe temporanee". Sono solo pipe, create dalla pipe()chiamata di sistema.
Sven Marnach,

Per essere molto precisi, potrebbe essere chiamato "pipe anonime", ma è sufficiente cercarlo su Google.

2
@WilliamPursell: non ci sono file coinvolti. La shell crea una pipe anonima utilizzando pipe()e quindi esegue il fork dei sottoprocessi. Il processo principale fa hanno descrittori di file addizionali aperta se viene utilizzato un tubo anonimo. Questi descrittori di file aggiuntivi vengono passati nel modulo /dev/fd/...e il processo di solito li apre semplicemente usando questi nomi di file. Ciò li porterà alla loro modifica dup(), creando descrittori di file ancora più aperti. Il processo potrebbe anche usare subito il descrittore di file con nome senza chiamate aperte ...
Sven Marnach

1
... come dimostrato in questo piccolo e stupido programma di test . Dopo aver compilato a, l'ho chiamato come ./a <(ls), e ha stampato correttamente l'elenco dei file, dimostrando che il decriptatore di file (63 nel mio caso) era già aperto. Il bash potrebbe usare named pipe in una directory temporanea su architetture diverse rispetto a Linux, nel qual caso nessun descrittore di file aggiuntivo sarebbe aperto quando si accede al processo principale.
Sven Marnach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.