$$在shell中意味着什么?

我曾经读过一种在临时文件的shell中获取唯一文件名的方法是使用双美元符号( $$ )。 这确实会产生一个不断变化的数字…但是如果您重复地调用它,它会返回相同的数字。 (解决的办法就是用这个时间。)

我很想知道$$实际上是什么,为什么会build议这种方法来生成唯一的文件名。

在Bash中, $$是进程ID,正如注释中所指出的那样,由于各种原因,使用临时文件名是不安全的。

对于临时文件名,请使用mktemp命令。

$$是bash中的进程ID(PID)。 使用$$是一个坏主意,因为它通常会创build一个竞争条件,并允许攻击者破坏你的shell脚本。 例如,看到所有这些创build不安全的临时文件并且必须发布安全build议的人。

相反,使用mktemp 。 mktemp的Linux手册页非常好。 以下是一些示例代码:

 tempfoo=`basename $0` TMPFILE=`mktemp -t ${tempfoo}` || exit 1 echo "program output" >> $TMPFILE 

$$是当前进程的ID。

在UNIX这样的操作系统中的每个进程都有一个(临时的)唯一的标识符PID。 同时运行的两个进程不能有相同的PID,而$$指的是运行脚本的bash实例的PID。

绝不是唯一的标识符,因为它永远不会被重用(事实上,PID是不断重用的)。 它给你的是一个数字,如果另一个人运行你的脚本,他们将得到一个不同的标识符,而你仍然在运行。 一旦你的死亡,PID可能会被回收,其他人可能会运行你的脚本,获得相同的PID,所以得到相同的文件名。

因此,只有说“$$给出了一个文件名,这样如果其他人运行相同的脚本,我的实例仍在运行,它们将会得到不同的名称”。

$$是你的PID。 它并不真正生成一个唯一的文件名,除非你小心,没有其他人完全一样的方式。

通常你会创build类似于/ tmp / myprogramname $$的东西

有很多方法可以解决这个问题,如果你写信给别的地方的话,其他人可以在很多操作系统上写出来并不是很难预测你将要拥有什么样的PID,想象一下你正在运行作为root用户,我创build/ tmp / yourprogname13395作为指向/ etc / passwd的符号链接,然后写入它。

在shell脚本中这是一件坏事。 如果你打算使用一个临时文件来做某些事情,你应该使用一种更好的语言,至less让你添加打开(创build)文件的“独占”标志。 那么你可以肯定你不会破坏别的东西。

$$是当前shell进程的pid。 这不是生成唯一文件名的好方法。

这是bash进程的进程ID。 没有并发进程会有相同的PID。

$$是脚本运行的shell的进程ID。 有关更多详细信息,请参阅sh或bash的手册页。 手册页可以使用命令行“man sh”或通过search“shell手册页”

$$是运行脚本的shell解释器的pid(进程id)。 现在在系统上运行的每一个进程都不一样,但是随着时间的推移,pid将会环绕,并且在你退出之后,最终会有另外一个有相同pid的进程。只要你运行,pid对你来说是唯一的。

从上面的定义可以明显的看出,无论脚本使用多less次$$,它都会返回相同的数字。

您可以使用/tmp/myscript.scratch.$$作为您的临时文件,用于不需要非常可靠或安全的事情。 例如,使用trap命令在脚本末尾删除这样的临时文件是一种很好的做法:

 trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT 

让我第二个emk的答案 – 不要使用$$本身作为“唯一”的任何东西。 对于文件,使用mktemp。 对于同一个bash脚本中的其他ID,使用“$$$(date +%s%N)”来获得相当好的唯一性。

  -k