echo $$ 做什么?

echo $$ 做什么?

我正在摆弄echo并尝试类似的东西echo ~。当我尝试使用$替换环境变量时,我不小心尝试了echo $$。令人惊讶的是,我得到的是一个六位数字,而不是空行269523。我不断尝试相同的命令,但数字没有改变。然而,当我几个小时后尝试时,号码发生了变化,但它仍然是一个六位数的号码。是什么意思echo $$$在环境变量的上下文中是否有其他类似的字符具有特殊含义?

答案1

在类似 Bourne 和类似 csh 的 shell(和perl)中,$是一个特殊参数,它扩展为执行 shell 解释器的进程的 id。$$用于扩展该参数值的参数扩展语法也是如此。

在文档中查找它并不容易,因为它至少也是分页器的搜索语法中的特殊字符(通常用于分页手册页),并且在$手册中随处可见。infoless$

zsh手册中,您可以在Shell 设置的参数部分 (info -n 'Parameters Set By The Shell' zsh):

$
该 shell 的进程 ID。请注意,这表示通过调用 zsh 启动的原始 shell;所有从 shell 分叉出来而不执行新程序的进程,例如由 (...) 启动的子 shell,都替换相同的值。

在 bash 手册中,特殊参数部分:

'$'
( $$) 扩展为 shell 的进程 ID。在“()”子 shell 中,它扩展为调用 shell 的进程 ID,而不是子 shell。

zsh 和 bash 手册都有一个索引条目(以及大多数特殊变量和参数),因此您可以通过以下方式访问它:

info zsh '$'
info bash '$'

正如两者所指出的,它不一定是解释(或执行echo)该echo $$命令的 shell 进程的 pid。为此,请参阅BASHPIDbash 和$sysparam[pid]zsh 中的特殊变量。

请注意,在除 zsh 之外的类似 Bourne 的 shell 中,您需要:

echo "$$"

echo $$没有引号一样,有特殊的语法来调用 split+glob 运算符,您在这里不需要它。但在实践中,只有$IFS包含数字时您才会看到差异。

bash-5.0$ echo $$ "$$"
33664 33664
bash-5.0$ IFS=6
bash-5.0$ echo $$ "$$"
33  4 33664

答案2

该参数(通过在其前面加上另一个前缀$来输出其值)是所有 POSIX 和类 POSIX shell(如和等)中的特殊参数(不是环境变量)。它保存当前 shell 的进程 ID (PID)。echo$bashzsh

该参数在 POSIX 标准中定义(参见特殊参数) 作为

$
扩展为所调用 shell 的十进制进程 ID。在子 shell 中(参见Shell执行环境),$应扩展到与当前 shell 相同的值。

由于即使第二个命令是在子 shell 中执行,echo "$$"(echo "$$")也会输出相同的 PID,因此bashshell 引入了该BASHPID变量,该变量在子 shell 中更新。这也不是环境变量。

上面的参考资料还将列出您可能要询问的八个特殊参数。请注意,下面的文本是我自己的话,您应该查看标准或您正在使用的特定 shell 的手册以获得更具体的描述。

  • @:"$@"是位置参数列表(通常是当前脚本或函数的命令行参数)。
  • *:"$*"是一个单个字符串,其位置参数使用 的第一个字符$IFS(通常是空格)作为分隔符连接起来。
  • #"$#"是位置参数的数量。
  • ?:"$?"是最近执行的命令的退出状态。
  • -:"$-"是包含当前设置的 shell 选项的字符串。
  • $:"$$"如上所述(当前shell的PID)。
  • !"$!"是最近启动的异步作业(“后台进程”)的PID。
  • 0:"$0"是当前 shell 或 shell 脚本的名称。这用于诊断消息。

答案3

这只是pid当前的shell

$ tr '\0' '\n' < /proc/$$/cmdline
bash

相关内容