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
, dash
、ksh
和zsh
不支持。
POSIX >|
是意味着强制替换 现有文件,即使noclobber
shell选项生效,其目的是防止 这样的替换 ("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
- 同上
我遇到了 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
, dash
、ksh
和zsh
不支持。
POSIX >|
是意味着强制替换 现有文件,即使noclobber
shell选项生效,其目的是防止 这样的替换 ("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
- 同上