如何在 zsh 中取消设置(撤消)unix set -C?

如何在 zsh 中取消设置(撤消)unix set -C?

这按预期工作

$ 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

答案1

废话。很简单

$ set +C

当然,我在发布问题后立即找到了答案。

+手册页实际上并没有提到和之间的区别-

答案2

看来你正在使用Z壳,但引用狂欢请参阅手册页。

set -C只是为了澄清,set +C命令在 zsh 中也有效,但在我看来更容易记住的是shell 选项

setopt no_clobber

这相当于set -C。并且,要禁用此选项,确实有一个unsetopt内置命令:

unsetopt no_clobber

所有选项都以 列出man zshoptions。选项有点对称,因此setopt no_clobber相当于unsetopt clobber。这就是为什么在手册页中克洛伯选项解释:

CLOBBER (+C,ksh: +C)

允许>重定向以截断现有文件并>>创建文件。否则,必须使用>!>|来截断文件,以及>>!>>|来创建文件。

一个相关的选项(在我看来非常方便)是

允许 CLOOBBER

添加|到历史记录中的输出重定向。这样即使未设置 CLOBBER,历史记录也可以引用 clobber 文件。

演示:

zsh$ setopt no_clobber hist_allowclobber
zsh$ echo foo>;baz
zsh$ 回显栏 > baz
zsh:文件存在:baz
zsh$[向上箭头]
zsh$ 回显栏 >|巴兹
zsh$

最后要说的是,选项不区分大小写,并且下划线会被忽略,因此NOCLOBBERNO_clobbernoclobber会以相同的方式处理。

相关内容