【问题标题】:Bash print stderr only, not stdout [duplicate]Bash 仅打印标准错误,而不是标准输出 [重复]
【发布时间】:2014-10-09 11:19:13
【问题描述】:

我想对文件进行 lint,并打印 stderr(错误消息),但不打印 stdout(表示文件正常)。

php -l "foo/bar.php"
  • 如果没有错误,它将向标准输出打印“无错误”消息。
  • 如果有错误,它会向 stderr 打印一条详细消息。我只想要这个。

我认为>& 会很神奇,但我一直不明白它们是如何工作的。

我想要的是消耗所有标准输出,保留标准错误。

(对不起,如果这是重复的,但我没有找到任何关于这个的问题)

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    只需将标准输出发送到 null:

    cmd > /dev/null
    

    这会保留标准错误,但会抑制标准输出。

    【讨论】:

    • 似乎不适用于source。我看到文件的内容和错误,或者都没有。使用source someFile 尝试了以下所有操作。以下工作可以抑制输出,但也会出现错误:/ &>/dev/null; >/dev/null 2>&1; /dev/null 2>/dev/null; >/dev/null 2>/dev/null;
    【解决方案2】:

    你可以使用:

    php -l "foo/bar.php" 2>&1 > /dev/null
    

    即将 stderr 重定向到 stdout 并将 stdout 重定向到 /dev/null 以便在您的终端上仅获取 stderr

    【讨论】:

    • 你打败了我几秒钟!!
    • 这不会将 stderr 放在“终端”上。它将 stderr 重定向到调用者的标准输出。人们犯的最大错误之一是将“终端”与“标准输出”混为一谈。两者是不同的。永远不要假设 stdout 是一个 tty。
    • @WilliamPursell 我真的想知道这是否适用于这些术语的原始含义。
    • @WilliamPursell :) 对于普通的 bash 用户(也可以说对于中级用户)大部分是一样的。因此,将其命名为最大的错误之一 有点过分。当我应该将某些事情称为最大的错误时,例如:cd /tnp; rm -rf *(作为 root 输入错误的 /tmp):)。但是,您是对的:这是一个常见错误,有时会导致奇怪的输出行为。 :)
    【解决方案3】:

    如果没有错误,它将向标准输出打印“无错误”消息。 如果有错误,它会向 stderr 打印一条详细消息。我只想要这个。

    如果发送了错误消息,则会打印错误消息,如果为空,则会打印No error.

    error=$(php -l "foo/bar.php" 2>&1 >/dev/null)
    [[ -z $error ]] && error="No error."
    echo "$error"
    

    【讨论】:

    • 这不仅对$(source foobar 2>&1 >/dev/null) 失败,而且随后使用最后一个回显第二次打印输出。我正在寻找source foobar 的方法,不显示 foobar 的内容,但仍然输出错误消息(如果文件不存在或无法读取,则生命。)
    • @rainabba 当然。问一个问题。
    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 2018-08-10
    • 1970-01-01
    • 2018-11-25
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多