5

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

$ 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 完成。

4

2 回答 2

2

这显然是 EPM 打包工具的一个特性。引用文档

请注意,列表文件中指定的所有命令都将使用 EPM 提供的变量扩展,因此请务必在命令中引用任何美元符号 ($) 字符。例如,“$foo”被替换为“foo”的值,但“$$foo”变成了“$foo”。

于 2015-12-29T07:49:21.867 回答
0

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

因为你有一个FOO之后,所以echo你得到了FOO11971

11971FOO

准确地说,它是运行会话的 bash shell 的进程 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
于 2015-12-22T12:42:10.517 回答