2008-09-16 31 views
109

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

我很想知道$$究竟是什么,以及为什么会建议它作为生成独特文件名的方法。

回答

69

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

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

+33

谁的人只是看看上面的回答,$$是不是罚款,甚至一个单一的文件,如果写一个公开,可写目录(例如,/ tmp)中。乱扔/ tmp符号链接会很容易,这会导致您的脚本写入某个不需要的地方。 mktemp好得多。 – 2008-09-17 00:11:25

+4

是的,使用$$会导致一个讨厌的安全漏洞。不要这样做。 – emk 2008-09-17 00:14:21

14

$$是当前进程的ID。

2

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

1

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

6

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

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

因此,只有说“$$给出的文件名如果其他人运行相同的脚本,并且我的实例仍在运行,它们将得到不同的名称”才真正理解。

1

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

4

$$是您的PID。它并不真正生成一个唯一的文件名,除非你非常小心,没有其他人以完全相同的方式进行操作。

通常你会创造这样的/ tmp/myprogramname $$

有这么多的方式来打破这一点,如果你正在写的位置其他人可以写这不是很多太难操作系统可以预测你将要拥有的PID,并假设你正在以root身份运行,并且创建/ tmp/yourprogname13395作为指向/ etc/passwd的符号链接 - 然后写入它。

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

1

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

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

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

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

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

取而代之,使用mktempLinux man page for mktemp非常好。下面是它的一些示例代码:

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

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

-k 
0

此外,您可以通过此命令抓登录用户名。例如。

echo $(</proc/$$/login id). After that, you need to use getent command. 
相关问题