这按预期工作
$ 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$
最后要说的是,选项不区分大小写,并且下划线会被忽略,因此NOCLOBBER
,NO_clobber
,noclobber
会以相同的方式处理。