GNU/Linux >> Znalost Linux >  >> Linux

Co přesně je <() v bash (a =() v zsh)?

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ánka lseek(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.


Linux
  1. Co je NFS a jak jej nainstalovat na Linux

  2. Rozdíl mezi ‚A‘ na příkazovém řádku (bash)??

  3. Co se přesně stane, když spustím soubor v prostředí Shell?

  1. Co znamená -s a [[]] ve stavu If v Bash?

  2. Co je SUID, SGID a Sticky bit?

  3. najít a zkopírovat soubor pomocí Bash

  1. Jaké funkce jsou v Zsh a chybí Bash, nebo naopak?

  2. Jak vypsat velikost každého souboru a adresáře a seřadit podle sestupné velikosti v Bash?

  3. Co je to stránka mapovaná v paměti a anonymní stránka?