`set -o noclobber` 阻止使用 `echo Hello >> file.txt` 创建文件

non*_*ity 3 bash zsh io-redirection

我已经用过

set -o noclobber
Run Code Online (Sandbox Code Playgroud)

多年来.bashrc或最近,.zshrc.

但是,我注意到,例如在 GitHub new repo 说明中,该行

echo SomeName >> README.md
Run Code Online (Sandbox Code Playgroud)

如果我.zshrc有这条线就会失败set -o noclobber。它会说:

zsh: no such file or directory: README.md
Run Code Online (Sandbox Code Playgroud)

为了确认,我将我的移动.zshrc.zshrc_not_used并启动一个新的 zsh,然后当文件不存在echo SomeName >> README.md时该行将起作用。README.md但现在如果我启动一个新的 zsh 并输入set -o noclobber并执行 do echo SomeName >> README_ANOTHER_ONE.md,那么它会说不README_ANOTHER_ONE.md存在。

(背景信息是>>“附加到”,并在文件不存在时创建该文件。)

这是怎么回事?当然,我想使用,set -o noclobber因为我不想意外删除任何文件,但为什么这与它noclobber有任何关系echo SomeName >> README.md,它说zsh: no such file or directory: README.md. 我告诉 shell 不要擦除某些内容,但它在没有擦除任何内容时拒绝创建新内容。

我实际上记得几年前在 Bash 中也发生过这种情况,但现在我无法重现它。有人知道发生了什么事以及对此有什么好的解决方案吗?(要解决问题,不要手动输入touch README.mdbefore echo SomeName >> README.md,因为那将是“在不知道发生了什么的情况下修复它”)

mur*_*uru 8

这被记录为 zsh 的传统行为(继承自 csh noclobber),appendcreate除了noclobber获取 ksh / POSIX 行为之外,还设置(假设 zsh 5.1 或更高版本):

APPEND_CREATE <K> <S>

此选项仅在NO_CLOBBER( -C) 有效时适用。

>>如果未设置此选项,则当对尚不存在的文件使用追加重定向 ( ) 时,shell 将报告错误(传统的 zsh 行为NO_CLOBBER)。如果设置了该选项,则不会报告任何错误(POSIX 行为)。

% set -o noclobber
% echo foo >> bar
zsh: no such file or directory: bar
% set -o appendcreate
% echo foo >> bar
% cat bar
foo
Run Code Online (Sandbox Code Playgroud)

  • `noclobber` 在 1990 年被添加到 bash 1.05 中,最初是作为*变量*(就像在 csh 中一样),而不是一个选项。它最初是阻止附加到现有文件,但很快就发生了变化。AFAICT,它从未阻止附加到不存在的文件。zsh 从一开始(1990 年的 1.0)就有 noclobber 选项,并且在附加模式方面与 csh 和今天类似。[append_create 是在 5.1 中添加的 POSIX 模式](https://www.zsh.org/mla/workers/2015/msg01579.html)。 (3认同)