$$FOO 在 bash 中做了什么(在用 epm 构建的 deb 包中)?

What does $$FOO do in bash (in a deb package built with epm)?

在命令行上,我得到这个:

$ FOO=foo
$ echo $FOO
foo
$ echo $$FOO
11971FOO

在这里,$$ 按预期解析为 shell 的 PID,并且 "FOO" 被逐字打印。

现在,为了理解和调试一些脚本,我发现了以下内容:

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $$FILE1 >> $$FILE2

有问题的脚本源自 Debian 软件包的安装后脚本。这是否应该在 运行 之前进行预处理?

更新: 该脚本是使用 epm 构建的包的一部分,并通过以下指令读取:

%postinstall <script.sh

在生成的 deb 包中,postinst 脚本显示为:

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $FILE1 >> $FILE2

因此,处理由 epm 或 dpkg 完成。

$$ 打印进程 ID,在您的情况下为 11971

因为你在 FOO 之后 echo 只是在 11971 之后转储 FOO 所以你得到

11971FOO

准确的说是你所在的bashshell的进程id 运行 会话。要验证这一点,您可以这样做:

kill -9 11971

这将终止当前会话。正常情况下的以下脚本

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $$FILE1 >> $$FILE2

不会进行任何预处理。它将继续附加文件

current_shell_process_id_FILE2

当前目录下内容

current_shell_process_idFILE1

这显然是 EPM 打包工具的一个功能。引用 the documentation:

Note that all commands specified in the list file will use the variable expansion provided by EPM, so be sure to quote any dollar sign ($) characters in your commands. For example, "$foo" is replaced by the value of "foo", but "$$foo" becomes "$foo".