Bash: Що робить "> |"?


148

Я щойно бачив це записане;

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

Вертикальні труби, що використовуються в стандартних переадресаціях, "перекладаючи" вихід однієї команди на іншу, >|насправді абсолютно марні, як це було б так само, як і >в цьому сценарії?



Для решти малюнка настійно рекомендую Які оператори контролю та перенаправлення оболонки?
Wildcard

Відповіді:


220

Це не марно - це спеціалізована форма >оператора простого перенаправлення (і, можливо, заплутано, нічого спільного з трубами). bashі більшість інших сучасних оболонок мають можливість noclobber, яка не дозволяє перенаправлення перезаписати або знищити файл, який вже існує. Наприклад, якщо noclobberце правда, а файл /tmp/output.txtвже існує, то це має бути невдалим:

$ some-command > /tmp/output.txt

Тим НЕ менше, ви можете явно перевизначити налаштування noclobberз >|перенаправленням оператора - перенаправлення буде працювати, навіть якщо noclobberвстановлений.

Ви можете дізнатися, чи noclobberвстановлено це у вашому поточному середовищі set -o.

Для історичної примітки, як опція "noclobber", так і його обхідні функції походять csh(кінець 70-х). kshскопіював його (на початку 80-х), але використовував >|замість цього >!. POSIX вказав kshсинтаксис (тому всі оболонки POSIX, включаючи bash, нові похідні золи, що використовуються як sh у деяких системах, підтримують його). Zsh підтримує обидва синтаксиси. Я не думаю, що він був доданий до будь-якого варіанту оболонки Борна, але я можу помилитися.


3
@sch - перегляньте свою історичну записку (спасибі за додаткову інформацію, btw) - FreeBSD's shпочинає noclobberприблизно з травня 2002 р.
D_Bye
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.