当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