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 .