Zsh 重定向 2>>|

Zsh redirection 2>>|

我遇到了 this,我正在复制它以调试 zsh 行编辑器小部件,我意识到我不知道 2>>| 实际上做了什么。大概是将 stderr 输入文件,但是 |?

是怎么回事?

啊,google给了我答案。

来自 zsh 重定向文档,

>>| word

>>! word

Same as >>, except that the file is created if it does not exist, even if CLOBBER is unset.

这基本上只是将 stderr 提供给文件,创建它。所以我今天也了解了 CLOBBER,这实际上是标准 >> 的更 "normal" 形式。也就是说,>> 可能会由于 CLOBBER 未设置而出错。

>>|zsh 选择偏离 POSIX 标准的另一个例子:

请注意 2>> 中的 2附带的 此处讨论的结构;它们使用默认输出流 - stdout,其文件描述符为 1 - 或任何明确指定的文件描述符,例如在这种情况下用于 stderr 的 2

>>| 的工作方式 有点类似于 POSIX >| 构造 ,但是 仅在 zsh 中支持 - 其他主要 POSIX 兼容的 shells - bash, dashkshzsh支持

POSIX >|意味着强制替换 现有文件,即使noclobbershell选项生效,其目的是防止 这样的替换 ("clobbering") 当只使用 > 时。

注意上面shell的全部noclobber默认是OFF。

POSIX 没有 提到类似的 >>| 结构,并且 bash, dash, ksh确实支持.
基本原理是:由于 >> 不替换,而是 附加 到现有文件,其操作不受 noclobber 是否生效的影响.
在这些 shell 中,>> 总是 允许 - 无论输出文件是否已经存在,是否 noclobber 是否设置(并且,如前所述,>>| 根本不支持)。

zsh求异,>>noclobber是否生效影响: 在 > / >| 逻辑的(可以说是合乎逻辑的) 反转 中,noclobber 有效,>> 仅在目标文件(已经)存在.

时有效

据此,zsh支持>>|(或>>!)到强制按需创建目标文件 ,即使 noclobber 有效。


zsh中有几种设置/取消设置noclobber选项的方法:

  • POSIX-兼容方式:

    • zsh -C -c '...' - 通过命令行选项-C开启,当开始zsh
      • set -C - 使用 set 内置
      • 打开
    • set -o noclobber - 按名称开启

如前所述,noclobber 默认关闭,但您可以通过简单地将 -C 替换为 +C 或将 set -o 替换为 [=58] 来明确关闭它=].

  • zsh-具体方式:

    • setopt noclobber - 相当于 set -o noclobber
      • options[noclobber]=on - 同上
    • setopt clobber - 相当于 set +o noclobber
      • options[clobber]=on - 同上