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
处理搜索字符串时,它使用括号作为语法而不是固定字符串来匹配.
如果grep输出ps aux
,您将始终获得显示上一个命令的进程.要解决此问题,您可以将输出管道输出两次grep,一次删除其中包含"grep"的行,再次针对您要查找的过程.
ps aux | grep -v "grep" | grep "Finder"
ps运行时'grep'进程已经运行,因此ps输出包含它.
请尝试使用pgrep
.
pgrep恰恰是为了这个目的:
if pgrep "bla bla" ; then echo "found" ; fi
归档时间: |
|
查看次数: |
22851 次 |
最近记录: |