为什么以下if
声明成功?
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
为什么以下if
声明成功?
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
因为grep
进程本身正在由ps
返回。你可以在“绝招” grep
不被周围的字符类[ ]
搜索字符,不改变功能的一场比赛本身: 只是做:
if ps aux | grep -q "[b]la bla" ; then echo "found" ; fi
而且,使用过程中替代$()
是不必要。 if
将在管道链上最后一个命令的成功工作,这是你想要的。
注:字符类招工作的原因是因为ps
输出仍然有字符类括号但当grep
正在处理搜索字符串,它使用了括号的语法,而不是一个固定的字符串相匹配。
'grep'进程在ps运行时已经运行,所以ps输出包含它。使用pgrep
代替。
p纤ep也正是为了这个目的:
if pgrep "bla bla" ; then echo "found" ; fi
Downvoter先生,我已经编辑了我的答案以获得更好的清晰度。请看看现在看起来好多了。 Ta – laher
如果使用grep命令从输出ps aux
,您将始终获得显示您以前的命令的过程。为了解决这个问题,你可以将输出传递给grep两次,一次删除其中包含“grep”的行,再一次找到你要找的进程。
ps aux | grep -v "grep" | grep "Finder"
$(
是一个小小的有点相关,并改变了一点意思。虽然在这种情况下,由于grep -q
从来没有任何输出,你可以放弃与$(
。你可能要开始与类似的信息(如由其他人指出):
if ps aux | grep -v 'grep' | grep -q 'bla bla'; then
echo 'Found'
fi
无论如何,你开始
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
随着$(
,在$()
里面的命令被执行,那输出命令用作外部命令的命令行。做到这四个实验:
# if $(echo nonexistant ; true) ; then echo "found" ; fi
nonexistant: command not found
# if $(echo nonexistant ; false) ; then echo "found" ; fi
nonexistant: command not found
# if $(echo ; true) ; then echo "found" ; fi
found
# if $(echo ; false) ; then echo "found" ; fi
因此,根据这一点,你就会输出得到found
如果这两个条件都成立:
$()
创建任何输出这表明ps aux | grep -q "bla bla"
成功并且没有输出。 grep -q
不产生输出并不奇怪。这就是-q
的用途。因此,您的命令必须具有真实的状态,这意味着grep确实找到了匹配项。我们知道在这种情况下grep
总会找到匹配项,因为ps
的进程列表将包含grep
本身; grep将始终找到自己。
不错的'爆炸'解释发生了什么。 – shellter
如果您运行'ps aux | grep“bla bla”'你会看到为什么... –
另请参见[这个问题](http://stackoverflow.com/questions/8965887/command-substitution-in-if-statement-condition)。 –
'if pgrep -f“bla bla”;然后回声“发现”; fi' – jordanm