使用管道处理 STDERR 时出错

An error occurred while processing STDERR using the pipe

我的工作目录如下:

MyWorkDirectory
└── test

文件“test”包含一行信息:

1:2:3:4:5

当我使用以下命令时:

cat test foo

输出结果如下:

1:2:3:4:5
cat: foo: No such file or directory

我想忽略STDOUT只处理STDERR,我想用cut命令得到第三个STDERR段用":"分隔,所以我尝试了以下命令:

cat test foo 2>&1 1>/dev/null | cut -d ':' -f 3

我觉得这里的输出应该是这样的:

No such file or directory

不过这里有很多不同的输出:

1、

 1
No such file or directory

2、

 No such file or directory
3

3、

2

4、

...

为什么会产生这些输出?如果我想实现我的目标,我应该使用什么命令?

这里的问题是“多重重定向”。

无法在 Ubuntu 上复制的原因是 Ubuntu(像许多基于 Debian 的 Linux 发行版一样)使用 Ash 或 Bash shell 默认情况下,最近的 MacOS 版本切换到使用 ZSH。

Ubuntu 上的 ZSH 将给出与您得到的类似的结果。

显然,同时使用重定向 > 和管道 | 会导致 ZSH 拆分您 stderr 类似于 tee 命令。

这个 post 显示了问题的解决方案: https://unix.stackexchange.com/questions/265061/how-can-i-pipe-only-stderr-in-zsh

具体来说,您需要在将 stdout 重定向到 /dev/null 之前关闭它以防止拆分:

cat test foo 2>&1 >&- > /dev/null | cut -d ':' -f 3

这适用于 Ubuntu 上的 ZSH,应该适用于 Mac OS。
如果没有,请检查链接 post 以在 shell.

中启用 mult_ios 选项