为什么“ pgrep -f bash”发出两个数字而不是一个数字?

时间:2018-11-18 19:47:30

标签: linux shell pid

当我在shell中运行此脚本时:

printf "Current bash PID is `pgrep -f bash`\n"

使用此命令:

$ bash script.sh

我得到以下输出:

Current bash PID is 5430
24390

每次运行它,我都会得到一个不同的数字:

Current bash PID is 5430
24415

第二行来自哪里?

1 个答案:

答案 0 :(得分:2)

在使用反引号(或更现代的$(...)语法进行命令替换)时,将创建一个子shell。那是外壳程序的fork()版本的独立副本,它具有自己的PID,因此pgrep找到了两个单独的外壳程序副本。 (此外,pgrep可以找到在系统上运行的bash副本与手边的脚本完全无关。)


如果要查找当前bash副本的PID,则可以直接查找它(当内容可以包含反斜杠或{的行为时,printfecho更好{1}}或非标准的bash扩展名echo -n是必需的,但是这两种情况都不是,所以echo -e很好):

echo

请注意,即使在子shell中执行,echo "Current bash PID is $$" 也会扩展为父shell的PID。在bash 4.0或更高版本中,即使在子shell中,您也可以使用$$查找当前的PID。


请参阅相关问题Bash - Two processes for one script