$$
在脚本中使用时提供脚本进程的进程ID,如下所示:
示例1
#!/bin/bash
# processid.sh
# print process ids
ps -o cmd,pid,ppid
echo "The value of \$\$ is $$"
$ ./processid.sh
CMD PID PPID
bash 15073 4657
/bin/bash ./processid.sh 15326 15073
ps -o cmd,pid,ppid 15327 15326
The value of $$ is 15326
观察$$
给出的pid,ps
15326
我的shell提示是pid 15073
但在子shell中,$$
给出了父shell的pid(15073)
示例2
$ ( ps -o cmd,pid,ppid ; echo $$ )
CMD PID PPID
bash 15073 4657
bash 15340 15073
ps -o cmd,pid,ppid 15341 15340
15073
这里的子shell是pid 15340
问题:为什么会这样?脚本是否也在子shell中运行?示例2中的子shell与示例1中脚本运行的shell之间有什么区别?
答案 0 :(得分:14)
我尝试并转义(将$$传递给子shell)不起作用,因为子shell继承了父bash的$$值。解决方法是使用$ BASHPID。
(echo $$; echo $BASHPID)
从父shell和子shell中打印PID。
答案 1 :(得分:9)
来自bash手册页:
$ Expands to the process ID of the shell. In a () subshell, it
expands to the process ID of the current shell, not the sub-
shell.
答案 2 :(得分:6)
替换发生在父shell中;替换发生时尚未启动子shell。
答案 3 :(得分:1)
更便携的方式,仅限linux,但也与dash兼容:
read -r my_pid _ < /proc/self/stat
echo $my_pid