How do I unset (undo) unix set -C in zsh?

7,337

Solution 1

Blah. It's as simple as

$ set +C

Of course I find the answer immediately after posting the question.

The man pages don't really mention the difference between + and -.

Solution 2

It seems you are using the Z shell, but quote the bash man page.

Just to clarify, the set -C and set +C commands work also in zsh, but more easily to memorize are IMHO shell options:

setopt no_clobber

This is equivalent to set -C. And, to disable this option, there is indeed a unsetopt builtin:

unsetopt no_clobber

All options are listed with man zshoptions. Options are kind of symmetric, so setopt no_clobber is equivalent to unsetopt clobber. That's why, in the man page the CLOBBER option is explained:

CLOBBER (+C, ksh: +C)

Allows > redirection to truncate existing files, and >> to create files. Otherwise >! or >| must be used to truncate a file, and >>! or >>| to create a file.

A related option (IMHO very handy) is

HIST_ALLOW_CLOBBER

Add | to output redirections in the history. This allows history references to clobber files even when CLOBBER is unset.

Demo:

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$

And as a last remark, options are case-insensitive and underscores are ignored, hence NOCLOBBER, NO_clobber, noclobber are treated the same way.

Share:
7,337

Related videos on Youtube

Thank you
Author by

Thank you

Updated on September 18, 2022

Comments

  • Thank you
    Thank you over 1 year

    This works as expected

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

    From 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 >.
    

    Ok, so let's set -C

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

    This is all well and good, but now it's time to turn off set -C.

    How do i disable set -C after it's been turned on?


    I've tried:

    $ unset -C
    zsh: bad option: -C