“/proc/self”和“/proc/$$”有什么区别?

5

我曾经认为在bash终端中 /proc/self/proc/$$ 是相同的,但现在我发现它们是不同的。

我知道$$表示当前进程的pid,而/proc/self是当前正在运行的进程,应该是bash终端。为什么它们不同呢?

root@VM-73-203-debian:~# echo $$
24415
root@VM-73-203-debian:~# ls -l /proc/self
lrwxrwxrwx 1 root root 0 Nov 22  2018 /proc/self -> 24465
root@VM-73-203-debian:~# ls -l /proc/$$
total 0
dr-xr-xr-x 2 root root 0 May 29 16:23 attr
...
1个回答

9

$$是bash的一个特殊变量,它会被扩展为当前shell进程的pid。

/proc/self是一个真正的符号链接,指向调用者的/proc/子目录。

当你执行ls /proc/$$时,shell会将其扩展为ls /proc/bash-pid,然后你就可以看到shell进程的内容。

但当你执行ls /proc/self时,你会看到短暂的ls进程的内容。

$$不仅限于此用法,你可以执行echo $$来查看bash pid;你也可以使用它来结束当前进程等操作。


1
我很挑剔,但特殊变量的名称是 $,前面的 $ 在扩展时给出值,我相信你知道。 - cdarke
1
@cdarke:你部分正确(我已检查文档以确保)。实际上,$ 不是特殊变量,而是一种 _特殊参数_,所以 $$ 更像是 $1 而不是 $PID。;-) - rodrigo
同意。历史上,像 x 这样的变量被称为命名参数,而 1 等则被称为未命名参数,而不是今天所说的位置参数。即使在现代的 man bash 中也是如此:“参数是存储值的实体”。然而,现在很少有人再使用参数这个词作为一般术语,更喜欢使用变量 - cdarke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接