仅打印Bash的stderr,而不是stdout。

71

我想对一个文件进行lint,输出标准错误(stderr)(即错误信息),但不输出标准输出(stdout)(表示文件OK)。

php -l "foo/bar.php"
  • 如果没有错误,则将“无错误”消息打印到stdout。
  • 如果有错误,则将详细消息打印到stderr。我只想要这一个。

我猜这将涉及使用>&的某些魔法,但我从未理解过它们是如何工作的。

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

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

3个回答

113

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

cmd > /dev/null

这将保留标准错误(stderr),但屏蔽标准输出(stdout)。


似乎无法与“source”一起使用。我可以看到文件的内容和错误,或者两者都没有。尝试了以下所有方法,使用“source someFile”。以下方法可以抑制输出,但也会出现错误:/&>/dev/null;
/dev/null 2>&1; /dev/null 2>/dev/null; /dev/null 2>/dev/null;
- rainabba
@rainabba:有可能你的命令将输出和错误都打印到了同一个流中,这种情况下你可能需要过滤输出(例如使用grep)才能得到你想要的结果。 - nneonneo

19

您可以使用:

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

即将标准错误重定向到标准输出,并且将标准输出重定向到/dev/null,以便在您的终端上只获取stderr


1
你只比我快了几秒钟!! - Raydel Miranda
7
这不会把 stderr "放在终端上"。 它将 stderr 重定向到调用者的 stdout 上。 人们经常犯的最大错误之一是混淆 "终端" 和 "stdout"。 这两者是不同的。 永远不要假设 stdout 是 tty。 - William Pursell
1
@WilliamPursell 我其实在想这是否适用于那些术语的原始含义。 - konsolebox
3
对于普通的Bash用户(可以说,对于中级用户也是如此),这两种写法基本一致。因此,将其称为“最大的错误之一”有些言过其实。如果要说哪些东西是最大的错误,那应该是像这样:cd /tnp; rm -rf *(在root权限下误输入了/tmp)。但是,你说得对:这是一个常见的错误,有时会导致奇怪的输出行为。 - clt60

0
如果没有错误,它会将“无错误”消息打印到标准输出。 如果有错误,则会将详细消息打印到标准错误。我只想要这个。
如果发送了错误消息,则会打印该错误消息,否则将打印“无错误”。
error=$(php -l "foo/bar.php" 2>&1 >/dev/null)
[[ -z $error ]] && error="No error."
echo "$error"

这不仅对 $(source foobar 2>&1 >/dev/null) 失败了,而且它还用最后的 echo 打印了输出的第二次。我正在寻找一种方法来 source foobar,不显示 foobar 的内容,但仍然输出错误消息(例如文件不存在或无法读取)。 - rainabba
@rainabba 当然可以。请问有什么问题吗? - konsolebox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接