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

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

我已经用过

set -o noclobber

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

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

echo SomeName >> README.md

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

zsh: no such file or directory: README.md

为了确认,我将我的移动.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,因为那将是“在不知道发生了什么的情况下修复它”)

答案1

这是有记录的作为 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

相关内容