1

Это работает как ожидалось

$ echo "foo" > foo
$ cat foo                # foo
$ echo "updated" > foo
$ cat foo                # updated

Из man set

-C      If  set, bash does not overwrite an existing file with the
        >, >&, and <> redirection operators.  This may be overridden
        when creating output files by using the redirection operator
        >| instead of >.

Хорошо, давайте set -C

$ set -C
$ echo "bar" > bar
$ cat bar                # bar
$ echo "updated" > bar
file exists: bar

Это все хорошо, но теперь пришло время выключить set -C .

Как отключить set -C после его включения?


Я пробовал:

$ unset -C
zsh: bad option: -C

2 ответа2

3

Мля. Это так же просто, как

$ set +C

Конечно, я нахожу ответ сразу после публикации вопроса.

Страницы руководства на самом деле не упоминают разницу между + и - .

2

Кажется, вы используете оболочку Z, но процитируйте справочную страницу bash .

Для пояснения, команды set -C и set +C работают также в zsh, но их легче запомнить - параметры оболочки IMHO:

setopt no_clobber

Это эквивалентно set -C . И, чтобы отключить эту опцию, действительно есть встроенная команда unsetopt :

unsetopt no_clobber

Все варианты перечислены в man zshoptions . Опции являются симметричными, поэтому setopt no_clobber эквивалентен unsetopt clobber . Вот почему на странице man поясняется опция CLOBBER :

CLOBBER (+C, ksh: +C)

Позволяет > перенаправить для усечения существующих файлов и >> для создания файлов. В противном случае >! или >| должен использоваться для усечения файла, а >>! или >>| создать файл.

Связанная опция (ИМХО очень удобная)

HIST_ALLOW_CLOBBER

Добавить | выводить перенаправления в историю. Это позволяет обращаться к хронологическим ссылкам на файлы clobber, даже если CLOBBER не установлен.

Демо-версия:

zsh$ setopt no_clobber hist_allowclobber
zsh$ echo foo > baz
zsh$ echo bar > baz
zsh: file exists: baz
zsh$ [Arrow UP]
zsh$ echo bar >| baz
zsh$

И, наконец, последнее замечание, что опции не чувствительны к регистру и подчеркивания игнорируются, поэтому NOCLOBBER , NO_clobber , noclobber обрабатываются одинаково.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .