$$在子shell脚本VS $$$$在子shell脚本VS $$($$ in a script vs

2019-05-12 04:55发布

$$给出脚本进程的进程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 $$ps15326

我的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

这里壳层是PID 15340

问:为什么会这样? 是不是剧本也处于子shell运行? 什么是例2中的子shell,并在其中的脚本示例1中运行shell之间的区别?

Answer 1:

我试着和逃避(传递$$的子shell)作为子shell继承父猛砸$$值不起作用。 对此的解决方案是使用$ BASHPID。

(echo $$; echo $BASHPID)

从父壳和从子外壳打印PID。



Answer 2:

从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.


Answer 3:

替换发生在母贝; 子shell还没有被替换发生的时间开始。



Answer 4:

较为简单的方式,仅支持Linux的,也有几许兼容:

read -r my_pid _ < /proc/self/stat
echo $my_pid


文章来源: $$ in a script vs $$ in a subshell