Toto není vícenásobný standardní vstup. Toto je bash'ismus, který se nazývá 'Process Substitution'http://tldp.org/LDP/abs/html/process-sub.html
Vytvoří pseudo soubor (/dev/fd/something
) pro každé střídání. Je to docela užitečné. Příkaz může číst pouze jako proud, což znamená, že nemůže přecházet tam a zpět pomocí funkce fseek. Potřebuje to číst jako proud bajtů, jako potrubí.
BONUSOVÁ odpověď
Abyste to mohli používat, nemusíte dělat příliš mnoho. Pokud jde o váš skript, dostane na příkazovém řádku platný název souboru, který lze otevřít() jako cokoli jiného. Jak řekli ostatní, uvidíte diff /dev/fd/XX /dev/fd/YY
. Pokud provedete stat() na kterémkoli z těchto pseudosouborů, uvidíte, že se jedná o pojmenovanou rouru a měli byste ji ošetřit sémantikou roury – jmenovitě žádné fseek() nebo ftell(). Pokud provedete test stat(), abyste explicitně zjistili, zda se jedná o soubor (např. [ -f $1 ]
) toto bude break - to je koneckonců implementováno jako pojmenované potrubí.
<(...)
zpracovává substituci v bash. Výstup procesu v závorkách je odeslán do dalšího deskriptoru souboru nad rámec normálních 3 a je vrácen název souboru odpovídající tomuto deskriptoru souboru. Tímto způsobem lze s výstupem příkazu zacházet jako s názvem souboru, který má být předán jinému příkazu.
Existuje jeden stdin
a jeden stdout
pro každý proces . Obvykle jsou připojeny k terminálu, ale mohou být přesměrovány odděleně od sebe.
V příkladu jsou dva wget
zapojených procesů, z nichž každý má svůj vlastní stdin
a stdout
. Každý wget
proces zapisuje na -
, což je jeho stdout
. Potom bash
's proces substituce <(...)
spojuje stdout
procesu do jedinečného pseudosouboru, ze kterého diff
umí číst. Všimněte si, že dvě substituce procesů poskytují dva různé pseudosoubory! Tedy diff
vidí něco jako:
diff /dev/fd/XX /dev/fd/YY
kde stdout
z wget -q -O - URL1
je připojen k /dev/fd/XX
a stdout
z wget -q -O - URL2
na /dev/fd/YY
.