【问题标题】:An error occurred while processing STDERR using the pipe使用管道处理 STDERR 时出错
【发布时间】:2022-01-23 09:37:35
【问题描述】:

我的工作目录如下:

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、

...

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

【问题讨论】:

  • 我每次都收到相同的 No such file or directory 唯一消息。
  • 我在 Ubuntu 系统上测试过,每次都得到相同的正确答案。但是当我在我的 MacBook 上测试它时,我得到了错误的结果。我的 macOS 版本是 12.1。

标签: linux macos pipe stdout cat


【解决方案1】:

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

这不能在 Ubuntu 上重现的原因是因为 Ubuntu(像许多基于 Debian 的 Linux 发行版一样)默认使用 Ash 或 Bash shell,而最近的 MacOS 版本切换到使用 ZSH。

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

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

这篇文章展示了该问题的解决方案: https://unix.stackexchange.com/questions/265061/how-can-i-pipe-only-stderr-in-zsh

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

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

这适用于 Ubuntu 上的 ZSH,并且应该适用于 Mac OS。
如果没有,请检查链接的帖子以在您的 shell 中启用 mult_ios 选项。

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 2017-09-30
    • 1970-01-01
    • 2017-07-07
    • 2019-02-15
    • 1970-01-01
    • 2011-12-17
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多