当我在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
第二行来自哪里?
答案 0 :(得分:2)
在使用反引号(或更现代的$(...)
语法进行命令替换)时,将创建一个子shell。那是外壳程序的fork()
版本的独立副本,它具有自己的PID,因此pgrep
找到了两个单独的外壳程序副本。 (此外,pgrep
可以找到在系统上运行的bash副本与手边的脚本完全无关。)
如果要查找当前bash副本的PID,则可以直接查找它(当内容可以包含反斜杠或{的行为时,printf
比echo
更好{1}}或非标准的bash扩展名echo -n
是必需的,但是这两种情况都不是,所以echo -e
很好):
echo
请注意,即使在子shell中执行,echo "Current bash PID is $$"
也会扩展为父shell的PID。在bash 4.0或更高版本中,即使在子shell中,您也可以使用$$
查找当前的PID。