当input不匹配时,防止grep返回一个错误

我想在bash脚本中写一段代码来检查一个程序是否已经在运行。 我有以下为了search栏是否正在运行

foo=`ps -ef | grep bar | grep -v grep` 

  grep -v grep 

部分是为了确保ps结果中不考虑“grep bar”

当酒吧没有运行,foo是正确的空。 但我的问题在于剧本的事实

  set -e 

如果某个命令返回一个错误,这是一个终止脚本的标志。 事实certificate,当bar没有运行时,“grep -v grep”与任何东西都不匹配,grep返回一个错误。 我尝试使用-q或-s,但无济于事。

有没有解决scheme? 谢谢

当然:

 ps -ef | grep bar | { grep -v grep || true; } 

甚至:

 ps -ef | grep bar | grep -v grep | cat 

避免grep -v grep是:

 ps -ef | grep '[b]ar' 

该正则expression式只匹配string“bar”。 但是在ps输出中,string“bar”不会出现在grep进程中。


在我学习pgrep之前的几天,我写了这个函数来自动执行上面的命令:

 psg () { local -a patterns=() (( $# == 0 )) && set -- $USER for arg do patterns+=("-e" "[${arg:0:1}]${arg:1}") done ps -ef | grep "${patterns[@]}" } 

然后,

 psg foo bar 

变成

 ps -ef | grep -e '[f]oo' -e '[b]ar' 

为什么要求ps提供大量的-ef输出,如果你只扔掉99%的呢? ps ,特别是GNU版本是一把便捷function的瑞士军刀。 尝试这个:

 ps -C bar -o pid= 1>/dev/null 

我在这里指定-o pid=只是因为,但实际上这是毫无意义的,因为我们抛弃了所有的stdout。 但是,如果您想知道实际运行的PID,那将是有用的。

如果-C未能匹配任何内容, ps自动返回一个非零的存在状态,如果匹配,则为零。 所以你可以简单地说这个

 ps -C bar 1>/dev/null && echo bar running || echo bar not running 

要么

 if ps -C bar 1>/dev/null ; then echo bar running else echo bar not running fi 

这不简单吗? 不需要grep,不需要两次甚至一次。

 foo=`ps -ef | grep bar | grep -v grep` || true