使用管道处理 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
选项
我的工作目录如下:
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
选项