我正在摆弄echo
并尝试类似的东西echo ~
。当我尝试使用$
替换环境变量时,我不小心尝试了echo $$
。令人惊讶的是,我得到的是一个六位数字,而不是空行269523
。我不断尝试相同的命令,但数字没有改变。然而,当我几个小时后尝试时,号码发生了变化,但它仍然是一个六位数的号码。是什么意思echo $$
?$
在环境变量的上下文中是否有其他类似的字符具有特殊含义?
答案1
在类似 Bourne 和类似 csh 的 shell(和perl
)中,$
是一个特殊参数,它扩展为执行 shell 解释器的进程的 id。$$
用于扩展该参数值的参数扩展语法也是如此。
在文档中查找它并不容易,因为它至少也是分页器的搜索语法中的特殊字符(通常用于分页手册页),并且在$
手册中随处可见。info
less
$
在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。为此,请参阅BASHPID
bash 和$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
$
bash
zsh
该参数在 POSIX 标准中定义(参见特殊参数) 作为
$
扩展为所调用 shell 的十进制进程 ID。在子 shell 中(参见Shell执行环境),$
应扩展到与当前 shell 相同的值。
由于即使第二个命令是在子 shell 中执行,echo "$$"
和(echo "$$")
也会输出相同的 PID,因此bash
shell 引入了该BASHPID
变量,该变量在子 shell 中更新。这也不是环境变量。
上面的参考资料还将列出您可能要询问的八个特殊参数。请注意,下面的文本是我自己的话,您应该查看标准或您正在使用的特定 shell 的手册以获得更具体的描述。
@
:"$@"
是位置参数列表(通常是当前脚本或函数的命令行参数)。*
:"$*"
是一个单个字符串,其位置参数使用 的第一个字符$IFS
(通常是空格)作为分隔符连接起来。#
:"$#"
是位置参数的数量。?
:"$?"
是最近执行的命令的退出状态。-
:"$-"
是包含当前设置的 shell 选项的字符串。$
:"$$"
如上所述(当前shell的PID)。!
:"$!"
是最近启动的异步作业(“后台进程”)的PID。0
:"$0"
是当前 shell 或 shell 脚本的名称。这用于诊断消息。
答案3
这只是pid
当前的shell
:
$ tr '\0' '\n' < /proc/$$/cmdline
bash