我曾经读到,在临时文件的 shell 中获得唯一文件名的一种方法是使用双美元符号($$)。这确实会产生一个随时间变化的数字... ... 但是如果你重复调用它,它会返回相同的数字。(解决办法就是利用时间。)
$$
我很想知道 $$实际上是什么,以及为什么建议用它来生成唯一的文件名。
$$是当前进程的 id。
$$是当前 shell 进程的 pid,这不是生成唯一文件名的好方法。
Bash$$中的进程 ID,正如注释中指出的那样,由于各种原因,将其用作临时文件名是不安全的。
对于临时文件名,使用 mktemp命令。
mktemp
它是 bash 进程的进程 ID。没有任何并发进程会有相同的 PID。
像 UNIX 操作系统中的每个进程都有一个(临时的)唯一标识符 PID。同时运行的任何两个进程都不能具有相同的 PID,$$指的是运行脚本的 bash 实例的 PID。
这在某种意义上是 没有的唯一标识符,因为它永远不会被重用(实际上,PID 是经常被重用的)。它给你的是一个数字,这样,如果另一个人运行你的脚本,他们会得到一个不同的标识符,而你的仍在运行。一旦您的 PID 死亡,可能会回收和其他人可能会运行您的脚本,得到相同的 PID,因此得到相同的文件名。
因此,只有说“ $$提供了一个文件名,如果其他人在我的实例仍在运行的情况下运行相同的脚本,他们将得到一个不同的名称”才是真正明智的。
$$是运行脚本的 shell 的进程 id。有关更多详细信息,请参见 sh 或 bash 的手册页。可以使用命令行“ man sh”找到手册页,也可以通过在 Web 上搜索“ shell manpage”找到手册页
$$是你的 PID。它不会真正生成一个唯一的文件名,除非您非常小心,而且没有其他人完全采用相同的方法。
通常您会创建类似于/tmp/myprogram name $$的内容
有很多方法可以解决这个问题,如果你写信给其他人可以写信的地方,那么在很多操作系统中,预测你将要使用的 PID 并不太困难——假设你以 root 用户身份运行,然后我创建/tmp/yourProgramname13395作为指向/etc/passwd 的符号链接——然后你向它写信。
在 shell 脚本中这样做是不好的。如果你要使用一个临时文件,你应该使用一个更好的语言,至少让你添加“独占”标志打开(创建)的文件。这样你就可以确定你不是在打击别的东西。
$$是运行脚本的 shell 解释器的 pid (进程 id)。当前在系统上运行的每个进程是不同的,但是随着时间的推移,pid 会被包装起来,当您退出后,最终将会有另一个具有相同 pid 的进程。只要您在运行,pid 对您来说就是独一无二的。
从上面的定义可以明显看出,无论在脚本中使用 $$多少次,它都会返回相同的数字。
您可以使用,例如/tmp/myscript.atch。$$作为你的临时文件的东西不需要非常可靠或安全。在脚本末尾删除这样的临时文件是一个很好的做法,例如,使用 trap 命令:
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
$$是 bash 中的进程 ID (PID)。使用 $$是一个坏主意,因为它通常会创建一个竞争条件,并允许您的 shell 脚本被攻击者破坏。例如,请参见所有创建不安全临时文件并必须发出安全警告的 这些人。
取而代之的是使用 mktemp。 Mktemp 的 Linux 手册页非常优秀。下面是它的一些示例代码:
tempfoo=`basename $0` TMPFILE=`mktemp -t ${tempfoo}` || exit 1 echo "program output" >> $TMPFILE
让我第二个 emk 的回答——不要使用 $$本身作为“唯一的”任何东西。对于文件,使用 mktemp。对于同一 bash 脚本中的其他 ID,使用“ $$$(date +% s% N)”可以获得 合情合理的唯一性。
-k
此外,您还可以通过这个命令获取登录用户名。
echo $(</proc/$$/login id). After that, you need to use getent command.
在 鱼外壳(3.1.2)中:
3.1.2
$符号也可以多次使用,作为一种“解引用”操作符(C 或 C + + 中的 *)
$
set bar bazz set foo bar echo $foo # bar echo $$foo # same as echo $bar → bazz