Questo non è un input standard multiplo. Questo è un bash'ismo chiamato 'Process Substitution'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 flusso, il che significa che non può andare avanti e indietro con fseek. Ha bisogno di leggerlo come un flusso di byte, come una pipe.
Risposta BONUS
Non è necessario fare troppo per usarlo. Per quanto riguarda il tuo script, ottiene un nome file valido sulla riga di comando, che può essere aperto () come qualsiasi altra cosa. Come altri hanno già detto, vedresti diff /dev/fd/XX /dev/fd/YY
. Se esegui uno stat() su uno qualsiasi di questi pseudo-file, vedrai che è una pipe con nome e dovresti trattarla con la semantica della pipe, vale a dire no fseek() o ftell(). Se esegui un test stat() per vedere esplicitamente se si tratta di un file (ad es. [ -f $1 ]
) questo sarà break - questo è implementato dopo tutto come una named pipe.
<(...)
elabora la sostituzione in bash. L'output del processo nelle parentesi viene inviato a un descrittore di file aggiuntivo oltre il normale 3 e viene restituito un nome file corrispondente a quel descrittore di file. In questo modo l'output di un comando può essere trattato come un nome file da passare a un altro comando.
C'è un stdin
e un stdout
per ogni processo . Di solito sono collegati al terminale, ma possono essere reindirizzati separatamente l'uno dall'altro.
Nell'esempio, ci sono due wget
processi coinvolti, ognuno dei quali ottiene il proprio stdin
e stdout
. Ogni wget
il processo scrive in -
, che è il suo stdout
. Quindi bash
sostituzione del processo di <(...)
connette il stdout
del processo in uno pseudo-file univoco, da cui diff
sa leggere. Nota che le due sostituzioni di processo producono due diversi pseudo-file! Quindi, diff
vede qualcosa come:
diff /dev/fd/XX /dev/fd/YY
dove stdout
di wget -q -O - URL1
è connesso a /dev/fd/XX
e stdout
di wget -q -O - URL2
a /dev/fd/YY
.