我已经用过
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.md
before 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