在脚本中的$$ vs子shell中的$$

时间:2011-04-11 00:00:12

标签: bash shell scripting

$$在脚本中使用时提供脚本进程的进程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之间有什么区别?

4 个答案:

答案 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