以下命令在 zsh v. 4.x 和 5.x 中产生不同的输出:
{
(
printf "X\nY\n"
printf "WARNING: foo\nWARNING: bar\n" >&2
printf "1\n2\n"
) 2>&1 >&3 | grep -v foo >&2
} 3>&1
(这段代码应该说明如何有选择地抑制程序发送到 stderr 的某些输出;在这种情况下,警告被foo
有选择地抑制,同时允许警告bar
通过;请注意,最后,stderr
流stdout
保持分离。)
在 v 4.x 上,我在终端看到的输出符合期望/预期:
X
Y
1
2
WARNING: bar
WARNING: bar
(您可能会看到该行相对于其他行的顺序不同。)
然而,在 v 5.0.7 (Debian) 和 5.1.1 (Darwin) 上,我在终端看到的是这样的:
X
Y
1
2
WARNING: bar
X
Y
1
2
IOW,应该发送的行stdout
出现两次。
我认为有三种可能:
- 这是 v.5.x 中的一个错误(在这种情况下我的问题是:有解决方法吗?)
- 我没有正确配置我的 v.5.x zsh(在这种情况下,我的问题是:我应该如何配置我的 v.5.x zsh 以获得所需的行为?);
- v. 4.x 中有一个错误,但 v. 5.x 中没有,它掩盖了我的代码中的错误(在这种情况下,我的问题是:如何修复我的代码以获得 v 5.x 中所需的行为) X?)
答案1
事实上,这个bug在4.0中已经被修复了。
multios
您所看到的是特定于 的选项的效果zsh
。如果您想看到与其他 shell 中相同的行为,您需要禁用该选项setopt nomultios
或调用zsh
as sh
。
使用multios
, in cmd1 >&3 | cmd2
,您可以将cmd1
的标准输出重定向到两者&3
,并将管道重定向到cmd2
。看如何在 zsh 中仅通过管道传输 stderr?更多细节。