命令的grep输出有时会起作用..有时候不行?

时间:2012-07-04 12:15:06

标签: grep gnu

请考虑以下事项:

$ cd ~/.emacs.d/lisp/tabbar
$ git pull
Already up-to-date.

$ git pull | grep -q "Already" ; echo $?
0

还在我身边吗?现在:

$ cd ~/src/emacs-tmp/trunk
$ bzr up                           
Tree is up to date at revision 108837 of branch /home/px/src/emacs-tmp/trunk

$ bzr up | grep -q "Tree" ; echo $?     
Tree is up to date at revision 108837 of branch /home/px/src/emacs-tmp/trunk
1

问题:

  • 为什么第一种情况下grep“0”(找到)的返回码为 “1”(未找到)在第二个?
  • 为什么是第一个(git pull)命令的输出 贪图时隐藏?

3 个答案:

答案 0 :(得分:1)

我认为你的“可见”命令输出到stderr,而不是stdout。 grep仅在stdout中查找,除非您使用2>& 1重定向。

因此,请尝试

bzr up 2>&1 | grep -q "Tree" ; echo $?

答案 1 :(得分:1)

看起来bzr正在输出到标准错误设备(/dev/stderr),而grep仅检查标准输入。您可以尝试将stderr重定向到stdin

来确认或拒绝此猜测
bzr up 2>&1 | grep -q "Tree" ; echo $?   

答案 2 :(得分:1)

  • 为什么第一种情况下grep为“0”(找到),第二种情况下为“1”(未找到)?

可能是因为在第一种情况下输出是在stdout上,而在第二种情况下是在stderr上。您可以在命令中添加“2>& 1”以将所有内容都输出到stadout。

  • 为什么在grepping时会隐藏第一个(git pull)命令的输出?

因为你说“-q”,它告诉grep闭嘴: - )