Più input standard? Come?


31

Da questa commandlinefu post :

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

Sembra più input standard ma --- se ricordo correttamente il mio corso di programmazione Linux --- questo non può essere. Ho pensato che, per definizione, lo standard input era un flusso.

Forse questo ha niente a che fare con lo stdin? Qualcuno può spiegarmelo? magari fornire collegamenti alla documentazione.

Bonus: In che modo uno script gestirà questi flussi multipli? Se qualcuno potesse fornire un esempio di Python o Perl, sarebbe molto utile.


1
Buona domanda. Nel caso in cui non si è a conoscenza, esiste un sito Q & amp; unix / linux: unix.stackexchange.com
Matt Ellen

2
Documentazione per le sostituzioni di processo: gnu.org/software/bash/manual/bashref.html#Process-Substitution
glenn jackman

Risposte:


24

Questo non è uno standard input multiplo. Questo è un bashismo chiamato "Sostituzione del processo" http://tldp.org/LDP/abs/html/process-sub.html

Crea uno pseudo file ( /dev/fd/something ) per ogni sostituzione. È piuttosto utile. Il comando può essere letto solo come un flusso, il che significa che non può andare avanti e indietro con fseek. Ha bisogno di leggerlo come un flusso di byte, come una pipa.

Risposta BONUS

Non è necessario fare troppo per usarlo. Per quanto riguarda lo script, ottiene un nome file valido sulla riga di comando, che può essere aperto () ed come qualsiasi altra cosa. Come altri hanno già detto, vedresti diff /dev/fd/XX /dev/fd/YY. Se fai una stat () su uno di questi pseudo-file, vedrai che è una named pipe, e dovresti trattarla con la semantica pipe - cioè no fseek () o ftell (). Se esegui un test stat () per vedere esplicitamente se si tratta di un file (ad es. [ -f $1 ] ) Questo volontà break - dopo tutto è implementato come un named pipe.


Un altro buon riferimento per la sostituzione del processo di bash - wiki.bash-hackers.org/syntax/expansion/proc_subst
studgeek

7

<(...) fa sostituzione del processo in bash. L'output del processo nei parens viene inviato ad un descrittore di file aggiuntivo oltre il normale 3 e viene restituito un nome file corrispondente al descrittore di quel file. In questo modo l'output di un comando può essere trattato come un nome file da passare a un altro comando.


6

C'è uno stdin e uno stdout per ogni processo . Solitamente sono collegati al terminale, ma possono essere reindirizzati separatamente l'uno dall'altro.

Nell'esempio, ce ne sono due wget processi coinvolti, ognuno dei quali ha il suo stdin e stdout. Ogni wget processo scrive a -, che è il suo stdout. Poi bash La sostituzione del processo <(...) collega il stdout del processo a uno pseudo file unico, da cui diff può leggere Nota che le due sostituzioni di processo producono due diversi pseudo-file! Così, diff vede qualcosa come:

diff /dev/fd/XX /dev/fd/YY

dove il stdout di wget -q -O - URL1 è collegato a /dev/fd/XX, e il stdout di wget -q -O - URL2 a /dev/fd/YY.

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.