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

$$FOO在bash中(在用epm构建的deb包中)做什么?,bash,deb,epm,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包的安装后脚本。在运行之前,是否应该进行预处理 更新:

在命令行中,我得到以下信息:

$ 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

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

$
打印流程ID,在您的案例中,流程ID为
11971

因为你有一个
FOO
在那之后
echo
只是在
11971
之后转储
FOO
,所以你得到

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

这显然是EPM打包工具的一个特性。引述:

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


OP已经明确表示,他们已经知道
$
本身意味着什么。@TomFenech:更新了我的答案。@sjsam感谢您的回答。我明白这一点。我想知道的是,在安装后脚本的上下文中,引用的行是否会有所不同。全局绑定和参数扩展是两件不同的事情。Paraemter扩展不是可以禁用的。在我看来,这似乎是一种创建目录的方法,其名称不会与任何现有目录发生冲突。如果这是一个实际的脚本,那么几乎可以肯定的是,它是要进行后处理的。但是,如果没有更多的上下文,就不可能确定;FOO=FOO;echo“${!FOO}”或在bashv4中使用“名称引用”:
FOO=bar;声明-n FOO=FOO;回显“$FOO”
current_shell_process_idFILE1