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

时间:2015-12-22 12:18:52

标签: bash deb 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完成。

2 个答案:

答案 0 :(得分:2)

这显然是EPM包装工具的一个特征。引用the documentation

  

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

答案 1 :(得分:0)

$$打印您的案例中的11971进程ID。

由于FOO之后echo只在[{1}}之后转储FOO所以你得到了11971

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