在命令行上,我得到了这个:
$ 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完成。
答案 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