当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