$$在shell中意味着什么?

Kit*_*tty 139 shell scripting

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

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

emk*_*emk 110

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

相反,使用mktemp.mktempLinux手册页很棒.这是一些示例代码:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.`mktemp`选项`-t`现在已被弃用(我认为是因为char`-`的问题).**这些天使用`mktemp $ {tempfoo} .XXXXXX`**.我冒昧地更新你的帖子. (3认同)
  • 另请注意,[反引号已弃用](http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_06_03),因此请改用`TMPFILE=$(mktemp)`。 (2认同)

Joe*_*ora 98

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

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

  • 对于那些只看最佳答案的人来说,如果写入可公开写入的目录(例如/ tmp),则对于单个文件来说,$$也不好.使用符号链接很容易乱丢垃圾/ tmp会导致脚本写入某个不受欢迎的地方.mktemp要好得多. (35认同)
  • 或者提出问题的人应该在下面设置较高等级的答案作为接受的答案...... (7认同)
  • 我为SEO添加"美元". (6认同)
  • 是的,使用$$将导致一个令人讨厌的安全漏洞.不要这样做. (4认同)
  • 如果 $$ 只是输出 pid,它怎么可能是“不安全的”?安全漏洞是由于糟糕的设计而不是在 tmp 文件名中使用 PID 造成的……如果您非常关心进入 tmp 的输出的完整性,也许您甚至不应该把它放在首位?$$ 不会造成安全漏洞,缺乏远见会 (2认同)

小智 19

$$是当前进程的id.


Ada*_*ght 7

UNIX操作系统中的每个进程都有一个(临时)唯一标识符PID.没有两个进程同时运行可以具有相同的PID,$$指的是运行脚本的bash实例的PID.

这是非常在某种意义上说,它永远不会被重复使用(实际上,PID被不断重复利用)的唯一idenifier.它给你的功能是一个数字,如果另一个人运行你的脚本,当你的脚本仍在运行时,他们会得到一个不同的标识符.一旦你死了,PID可以被回收,其他人可能会运行你的脚本,得到相同的PID,所以得到相同的文件名.

因此,只有说"$$给出一个文件名,如果其他人运行相同的脚本,我的实例仍在运行,他们会得到一个不同的名称",这真是理智.


JBB*_*JBB 5

$$是您的PID。它不会真正生成唯一的文件名,除非您小心谨慎并且没有其他人使用完全相同的方式。

通常,您会创建/ tmp / myprogramname $$之类的东西

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

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