Bash - 一个脚本的两个进程

时间:2017-06-26 12:28:13

标签: bash shell unix ps

我有一个名为test.sh的shell脚本:

#!/bin/bash
echo "start"
ps xc | grep test.sh | grep -v grep | wc -l
vartest=`ps xc | grep test.sh | grep -v grep | wc -l `
echo $vartest
echo "end"

输出结果为:

start
1
2
end

所以我的问题是,为什么有两个test.sh进程在我使用``调用ps时运行(与$()相同)而不是直接调用ps时? 如何获得所需的结果(1)?

1 个答案:

答案 0 :(得分:6)

当您启动子shell时,与反引号一样,bash会自行分叉,然后执行您想要运行的命令。然后你还运行一个管道,导致所有这些都在他们自己的子shell中运行,所以你最终得到了等待管道完成的脚本的“额外”副本,这样它就可以收集输出并将其返回给原始剧本。

我们将使用(...)在子shell中显式运行进程并使用pgrep命令为我们执行ps | grep "name" | grep -v grep,只是向我们展示与我们的字符串匹配的进程:

echo "Start"
(pgrep test.sh)
(pgrep test.sh) | wc -l
(pgrep test.sh | wc -l)
echo "end"

在我的跑步中产生输出:

Start
30885
1
2
end

因此,我们可以看到在子shell中运行pgrep test.sh只能找到test.sh的单个实例,即使该子shell是管道本身的一部分。但是,如果子shell包含一个管道,那么我们得到脚本的分叉副本,等待管道完成