$$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".
在命令行上,我得到这个:
$ 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".