【问题标题】:How to use shell pipes to conditionally display output based on the exit code?如何使用 shell 管道根据退出代码有条件地显示输出?
【发布时间】:2017-05-05 10:56:35
【问题描述】:

我有一个总是冗长的foobar 命令,我想仅在 foobar 退出代码是错误代码时将其输出(stdout 和 stderr)显示到控制台。

我想实现这个不将输出保存到临时文件。我已经知道该解决方法,但我不想生成新文件。

暗示这种解决方案的缺点是只有在 foobar 结束时才能看到整个输出,因为只有这样我们才能知道它是否成功。

【问题讨论】:

  • 能举个代码例子吗?
  • 还有你不能使用文件的原因吗?
  • 这不是解决方法;这是你必须做的。 Shell 不会以任何其他方式为您缓冲输出。

标签: bash shell pipe stdout


【解决方案1】:

您可以尝试将输出保存在变量中。一个简单的衬线是:

r=$(foobar 2>&1) || echo "$r"

【讨论】:

  • 我发现了一个重要的缺点,当使用这种方法时,我不希望使用 ANSI 着色。
  • @sorin ANSI 代码应该可以正常工作,并且在我的测试中也可以。 r=$(printf "\\033[33mHello\\033[39m\n"; exit 1) || echo "$r" 在我的终端上以黄色打印“Hello”。 echo 不会解释转义序列,但如果您在直接运行时获得颜色,则您的 foobar 命令应该这样做。
  • 确实,我只需要强制使用它们,但任何包装器都需要这样做。我最终实现了您的解决方案,没有外部工具。
【解决方案2】:

您可能需要chronic 实用程序:

chronic 运行命令,并安排其标准输出和标准错误仅在命令失败(退出非零或崩溃)时显示。如果命令成功,任何无关的输出都将被隐藏。

可用性:

  • apt-get install moreutils 在 Debian/Ubuntu 上
  • brew install moreutils 在 MacOS (OSX) 上
  • yum install moreutils 在 RHEL(epel)/Fedora/CentOS 上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多