Bash: Что делает «> |»?

148

Я только что видел это записано;

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

Вертикальные каналы, используемые в стандартных перенаправлениях, «передающие» выходные данные одной команды другой, >|на самом деле совершенно бесполезны, поскольку будут такими же, как и >в этом сценарии?

jwbensley
источник
1
Посмотрите >|на: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21/…
Ф. Хаури
Для остальной части картины я настоятельно рекомендую Какие операторы управления оболочки и перенаправления?
Wildcard

Ответы:

220

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

$ some-command > /tmp/output.txt

Однако вы можете явно переопределить настройку noclobberс помощью >|оператора перенаправления - перенаправление будет работать, даже если noclobberоно установлено.

Вы можете узнать, установлен ли noclobberон в вашей текущей среде с помощью set -o.

Для исторического примечания, и опция "noclobber" и ее особенности обхода берут начало csh(конец 70-х). kshскопировал его (начало 80-х), но использовал >|вместо >!. В POSIX указан kshсинтаксис (поэтому все оболочки POSIX, включая bash, более новые производные золы, используемые в некоторых системах как sh, поддерживают его). Zsh поддерживает оба синтаксиса. Я не думаю, что это было добавлено к любому варианту оболочки Bourne, но я могу ошибаться.

D_Bye
источник
3
@sch - повторяю вашу историческую заметку (спасибо за дополнительную информацию, кстати) - FreeBSD shимеет noclobberпримерно с мая 2002 года.
D_Bye