zsh 5x 中可能存在重定向错误

zsh 5x 中可能存在重定向错误

以下命令在 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通过;请注意,最后,stderrstdout保持分离。)

在 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出现两次。

我认为有三种可能:

  1. 这是 v.5.x 中的一个错误(在这种情况下我的问题是:有解决方法吗?)
  2. 我没有正确配置我的 v.5.x zsh(在这种情况下,我的问题是:我应该如何配置我的 v.5.x zsh 以获得所需的行为?);
  3. v. 4.x 中有一个错误,但 v. 5.x 中没有,它掩盖了我的代码中的错误(在这种情况下,我的问题是:如何修复我的代码以获得 v 5.x 中所需的行为) X?)

答案1

事实上,这个bug在4.0中已经被修复了。

multios您所看到的是特定于 的选项的效果zsh。如果您想看到与其他 shell 中相同的行为,您需要禁用该选项setopt nomultios或调用zshas sh

使用multios, in cmd1 >&3 | cmd2,您可以将cmd1的标准输出重定向到两者&3,并将管道重定向到cmd2。看如何在 zsh 中仅通过管道传输 stderr?更多细节。

相关内容