Toto se nazývá substituce procesu.
<(list)
syntaxe je podporována oběma, bash
a zsh
. Poskytuje způsob, jak předat výstup příkazu (list
) na jiný příkaz při použití kanálu (|
) není možné. Například když příkaz prostě nepodporuje vstup z STDIN
nebo potřebujete výstup více příkazů:
diff <(ls dirA) <(ls dirB)
<(list)
připojí výstup list
se souborem v /dev/fd
, pokud to systém podporuje, jinak se používá pojmenovaná roura (FIFO) (která také závisí na podpoře ze strany systému; žádná příručka neříká, co se stane, když oba mechanismy nejsou podporovány, pravděpodobně se to přeruší s chybou). Název souboru je pak předán jako argument na příkazovém řádku.
zsh
navíc podporuje =(list)
jako možná náhrada za <(list)
. S =(list)
místo souboru v /dev/fd
je použit dočasný soubor nebo FIFO. Může být použit jako náhrada za <(list)
pokud program potřebuje lseek ve výstupu.
Podle manuálu ZSH mohou být také další problémy s tím, jak <(list)
funguje:
=
formulář je užitečný jako/dev/fd
a implementace pojmenovaného kanálu<(...)
mít nevýhody. V prvním případě mohou některé programy automaticky zavřít příslušný deskriptor souboru před prozkoumáním souboru na příkazovém řádku, zejména pokud je to nutné z bezpečnostních důvodů, například když program běží setuid. Ve druhém případě, pokud program ve skutečnosti neotevře soubor, podskořápka pokoušející se číst nebo zapisovat do roury se (v typické implementaci mohou mít různé operační systémy různé chování) navždy zablokovat a musí být explicitně zabita. . V obou případech shell ve skutečnosti dodává informace pomocí roury, takže programy, které očekávají, že budou lhledat (viz manuálová stránkalseek(2)
) v souboru nebude fungovat.
Všimněte si, že toto je bashová odpověď, nikoli zsh.
V bash existují případy, kdy nelze použít roury:
some_command | some_other_command
protože potrubí zavádí podskořápky pro každou komponentu potrubí, když podskořápky opustí, všechny vedlejší účinky, na které jste spoléhali, by zmizely. Například tento vymyšlený příklad:
cat file | while read line; do ((count++)); done
echo $count
zobrazí prázdný řádek, protože $count
proměnná v aktuálním shellu neexistuje.
Substituce procesu bash vám umožní vyhnout se tomuto hlavolamu tím, že vám umožní číst z výstupu "some_command" jako ze souboru
while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count # the variable *does* exist in the current shell
(1) je normální přesměrování vstupu. (2) je začátek <()
syntaxe substituce procesu.