$$在外壳中是什么意思?

时间:2020-03-05 18:57:32  来源:igfitidea点击:

我曾经读过一种在外壳中为临时文件获取唯一文件名的方法是使用双美元符号($$)。这确实会产生不时变化的数字...但是,如果我们反复调用它,它将返回相同的数字。 (解决方案是只使用时间。)

我很想知道$$到底是什么,以及为什么会建议将它作为生成唯一文件名的一种方式。

解决方案

回答

$$是当前进程的ID。

回答

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

回答

在Bash中,$$是进程ID,如注释中所述,由于多种原因,用作临时文件名并不安全。

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

回答

它是bash进程的进程ID。任何并发进程都不会具有相同的PID。

回答

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

从永远不会被重用的意义上讲,这绝不是唯一的标识符(实际上,PID被不断重用)。它提供给是一个数字,这样,如果另一个人运行脚本,当脚本仍在运行时,他们将获得一个不同的标识符。死后,PID可能会被回收,其他人可能会运行脚本,获得相同的PID,从而获得相同的文件名。

这样,说" $$给出一个文件名,以便如果其他人在我的实例仍在运行的情况下运行相同的脚本,他们将获得不同的名称",这才是真正的理智。

回答

$$是运行脚本的shell的进程ID。有关更多详细信息,请参见sh或者bash的手册页。可以通过使用命令行" man sh"或者在网上搜索" shell手册页"来找到手册页。

回答

$$是PID。它不会真正生成唯一的文件名,除非我们小心谨慎并且没有其他人以完全相同的方式进行操作。

通常,我们会创建类似/ tmp / myprogramname $$的内容

有很多方法可以解决这个问题,如果我们要写给其他人可以写的位置,那么在许多操作系统上就很难预测要拥有的PID并拧紧它-想象我们正在运行根目录,我创建/ tmp / yourprogname13395作为指向/ etc / passwd的符号链接-并将其写入其中。

在shell脚本中这样做是一件坏事。如果我们打算将临时文件用于某些用途,则应该使用一种更好的语言,该语言至少可以让我们添加用于打开(创建)文件的"独占"标志。然后,我们可以确保我们没有破坏其他东西。

回答

$$是运行脚本的Shell解释器的pid(进程ID)。当前系统上运行的每个进程都不同,但是随着时间的流逝,pid会回绕,并且退出后,最终会有另一个进程具有相同的pid。

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

我们可以使用例如/tmp/myscript.scratch.$$作为临时文件,用于不需要非常可靠或者安全的事情。最好在脚本末尾使用诸如trap命令删除此类临时文件:

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

回答

$$是bash中的进程ID(PID)。使用$$是一个坏主意,因为它通常会创建竞争条件,并允许攻击者破坏shell脚本。例如,请参阅所有创建不安全的临时文件并必须发布安全公告的人员。

而是使用mktemp。 mktemp的Linux手册页非常棒。以下是其中的一些示例代码:

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

回答

让我第二个emk的答案-不要将$$本身用作任何"独特"的东西。对于文件,请使用mktemp。对于同一bash脚本中的其他ID,请使用" $$$(date +%s%N)"来获得相当大的唯一性机会。

##代码##