为什么"如果$(ps aux | grep ...)"总是在Bash中成功?

Mis*_*hko 23 bash if-statement

为什么以下if声明成功?

if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 38

因为grep进程本身正在返回ps.你可以grep通过围绕一个[ ]不改变功能的字符类中的一个搜索字符来"欺骗" 自己不匹配:只需:

if ps aux | grep -q "[b]la bla" ; then echo "found" ; fi
Run Code Online (Sandbox Code Playgroud)

而且,$()不需要使用过程替换.这if将成为管道链中最后一个命令的成功,这就是你想要的.

注意:字符类技巧起作用的原因是因为ps输出仍然具有字符类括号,但在grep处理搜索字符串时,它使用括号作为语法而不是固定字符串来匹配.


Son*_*c84 8

如果grep输出ps aux,您将始终获得显示上一个命令的进程.要解决此问题,您可以将输出管道输出两次grep,一次删除其中包含"grep"的行,再次针对您要查找的过程.

ps aux | grep -v "grep" | grep "Finder"


lah*_*her 7

ps运行时'grep'进程已经运行,因此ps输出包含它.

请尝试使用pgrep.

pgrep恰恰是为了这个目的:

if pgrep "bla bla" ; then echo "found" ; fi