it-swarm-eu.dev

Bash: Co dělá "> |" dělat?

Právě jsem to viděl zapsán;

$ some-command >| /tmp/output.txt

Vertikální potrubí se používá ve standardních přesměrováních „piping“ výstup jednoho příkazu na druhý, je >| ve skutečnosti úplně zbytečné, protože by to bylo stejné jako jen > v tomto scénáři?

152
jwbensley

Není to zbytečné - je to specializovaná forma pláně > přesměrovává operátora (a možná matoucí, co do činění s potrubím). bash a většina dalších moderních prostředí má možnost noclobber, která zabraňuje přesměrování přepsat nebo zničit soubor, který již existuje. Například pokud noclobber je true a soubor /tmp/output.txt již existuje, pak by to mělo selhat:

$ some-command > /tmp/output.txt

Nastavení noclobber však můžete explicitně přepsat pomocí >| operátor přesměrování - přesměrování bude fungovat, i když je nastaveno noclobber.

Můžete zjistit, zda je noclobber nastaveno ve vašem aktuálním prostředí pomocí set -o.

Pro historickou poznámku jak možnost „noclobber“, tak její funkce obejít pocházejí z csh (pozdní 70. léta). ksh zkopíroval (začátkem 80. let), ale použil >| namísto >!. POSIX specifikoval syntaxi ksh (takže ji podporují všechny shelly POSIX včetně bash, novější deriváty popela používané jako sh na některých systémech). Zsh podporuje obě syntaxe. Nemyslím si, že byl přidán do jakékoli varianty Bourne Shell, ale možná se mýlím.

229
D_Bye