有关后台进程中 $$ 值的文档

有关后台进程中 $$ 值的文档

$$是否有关于bash 后台进程中的值的文档?


man声称$$在子shell中是主进程的PID。

根据以下文档,子shell是通过大括号创建的(...),但是,它似乎cmd &不是正式的子shell。

https://tldp.org/LDP/abs/html/subshel​​ls.html

https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap03.html

答案1

来自标准:

命令替换、用括号分组的命令以及异步列表应在子shell环境中执行。

cmd &是一个异步列表


并假设(为了论证)那cmd &不是一个子shell,那么唯一剩下的就是主要的shell 环境,$$主进程的 PID 是一样的;-)


注意:在 bash 中,管道中的所有命令也都在子 shell 中运行。在 ksh 等其他一些 shell 中,管道中的最后一个命令在主 shell 环境中运行。这将打印1bash3ksh

a=1; a=2 | a=3; echo $a

答案2

$$文档中有一些参考man bash

特殊参数

$扩展为 shell 的进程 ID。在()子 shell 中,它扩展为当前 shell 的进程 ID,而不是子 shell。

外壳变量

BASHPID扩展为当前 bash 进程的进程 ID。这与$$某些情况下不同,例如不需要重新初始化 bash 的子 shell。

命令执行环境

shell有一个执行环境,它由以下部分组成:

  • [...]
  • 各种进程 ID,包括后台作业的进程 ID、 的值$$和 的值PPID

根据经验,您可以看到$$在语法子 shell 中保持不变,但$BASHPID发生了变化:

echo "$BASHPID - $$"                     # 23671 - 23671
( echo "$BASHPID - $$" )                 # 41199 - 23671
true | ( echo "$BASHPID - $$" ) | cat    # 41258 - 23671

相关内容