$$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