`ps |中第二个grep的功能 grep -v | grep`

Kra*_*ran 3 grep ps

ps aux  | grep firefox
Run Code Online (Sandbox Code Playgroud)

列出所有具有字符串“firefox”的进程

ps aux  | grep -v firefox
Run Code Online (Sandbox Code Playgroud)

列出没有字符串“firefox”的所有进程

ps aux | grep -v grep | grep firefox ?

第二个 grep 有什么作用?grep 本身就是一个命令,那么为什么我们要 grep 另一个 grep 呢?

Ste*_*ris 15

当您执行诸如

ps aux  | grep firefox
Run Code Online (Sandbox Code Playgroud)

然后该grep过程本身可能会显示在输出中,因为您正在寻找的词存在。例如,在我的机器上运行chrome并得到类似的结果:

% ps aux | grep chrome
sweh      3384  0.0  0.0  11128  1024 pts/1    S+   07:08   0:00 grep chrome
sweh     23698  0.0  0.0   6384   620 ?        S    Jul04   0:00 /usr/lib/chromi
Run Code Online (Sandbox Code Playgroud)

我们可以看到进程 3384 是grep命令并且匹配,因为出现了chrome一词。

为了避免这种情况,有些人然后添加第二个 | grep -v grep以删除该行。

不过有骗子...

ps aux | grep '[f]irefox'
Run Code Online (Sandbox Code Playgroud)

grep '[f]irefox'匹配与 完全相同的行grep firefox,但现在该grep命令将永远不会匹配自身,因为该单词并未按字面出现在该命令上。


Kus*_*nda 8

ps命令将输出您当前正在运行的所有进程。第一个将从该列表中grep删除该grep进程。第二个将提取firefox过滤列表中的任何进程。

这可能是获取进程的进程 ID (PID) 的部分尝试firefox,可能只是为了查看它是否正在运行或终止它。

如果是这种情况,我强烈建议您改用pgrep(或者pkill,如果您要终止进程):

if pgrep firefox 2>/dev/null; then
  echo "firefox is already running"
else
  echo "starting firefox..."
  firefox &
done
Run Code Online (Sandbox Code Playgroud)

终止firefox

pkill firefox
Run Code Online (Sandbox Code Playgroud)

也就是说,不要先找到它的PID。

另请参阅系统手册pgreppkill系统手册。