为什么;如果美元(ps aux“grep…”);总是在Bash中成功吗?
如果语句成功,为什么会出现以下为什么;如果美元(ps aux“grep…”);总是在Bash中成功吗?,bash,if-statement,Bash,If Statement,如果语句成功,为什么会出现以下 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将对管道链中最后一个命令的成功起作用,这正是您想要的 注意:字符
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
处理搜索字符串时,它使用括号作为语法,而不是固定字符串进行匹配。在ps运行时,“grep”进程已经运行,所以ps输出包括它
尝试改用pgrep
pgrep正是出于这一目的:
如果pgrep“bla bla”;然后回声“发现”;fi
您需要过滤掉grep
ping用于“bla-bla”的流程:
$ if ps aux | grep -v 'grep' | grep -q 'bla bla'; then
echo 'Found'
fi
如果将ps aux
的输出grep,您将始终得到一个显示上一个命令的进程。要解决这个问题,您可以将输出通过管道传输到grep两次,一次是删除其中带有“grep”的行,另一次是删除您要查找的进程
ps aux | grep -v "grep" | grep "Finder"
ps aux | grep-v“grep”| grep“查找器”
$(
有一点相关性,它的含义也有一点变化。虽然在这种情况下,因为从grep-q
中从来没有任何输出,所以您可以不使用$(
)了。您可能想从以下内容开始(正如其他人所指出的):
不管怎样,你是从
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
因此,如果这两个条件都成立,您将据此输出getfound
:
$()
中的命令未创建任何输出
- 命令成功了
这表明,ps aux | grep-q“bla-bla”
成功且未创建任何输出。grep-q
未创建任何输出并不奇怪。-q
就是用于此目的的。因此,您的命令必须具有真实状态,这意味着grep已成功找到匹配项。我们知道在这种情况下,grep
始终会找到匹配项,因为来自ps
的进程将包括grep
本身;grep将始终找到自己。如果您运行ps aux | grep“bla bla”
您将看到原因…另请参见。如果pgrep-f“bla bla bla”;那么echo“found”;fi
您不想在目标grep之后使用-v grep吗?(如果我投了反对票,我会说为什么).我还两次在没有任何解释的情况下被否决。我认为有人在这个问题上投了非常慷慨的否决票…@amir75:看起来所有的否决票都消失了(同样没有解释!);-)祝大家好运。@Sheller:正常情况下,是的,我会在grep
之后进行筛选,但是因为我们正在调用grep-q
,所以没有什么可筛选的。我不会跟随否决票评论(这个答案没有投票).对正在发生的事情进行了很好的“爆炸式”解释。Downvoter先生,我对我的答案进行了编辑,以使其更清晰。请看它现在看起来是否更好。TaI对这个把戏太兴奋了。:D向| grep-v grep吹气总是让我伤心,现在我不必再这么做了!
# 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