Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么;如果美元(ps aux“grep…”);总是在Bash中成功吗?_Bash_If Statement - Fatal编程技术网

为什么;如果美元(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
因此,如果这两个条件都成立,您将据此输出get
found

  • $()
    中的命令未创建任何输出
  • 命令成功了

这表明,
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