我发现这是一个如何将“eval”的输出存储到一个名为line的变量的建议。那么,\$$
的用途是什么?
command = "some command"
line = $(eval \$$command)
答案 0 :(得分:3)
\$
阻止shell尝试将$
视为参数扩展的开头。但是,代码作为一个整体并没有做任何有用的事情。修复空白问题并向示例添加实际命令后,您的代码看起来像
command="ls -l"
line=$(eval \$$command)
command
只是一个字符串ls -l
。为了评估下一行,shell首先评估命令替换。第一步是展开参数command
,产生line=$(eval \$ls -l)
。引用删除消除了反斜杠,因此eval
接收参数$ls
和-l
。由于ls
可能不是变量,$ls
会扩展为空字符串,而eval
只需-l
即可执行。没有这样的命令,你会收到错误。
您可能认为,正确的形式只是
line=$(eval $command)
或略好一点
line=$(eval "$command")
这适用于简单案例,但不是一般的。在许多问题中,这已被多次抛弃;有关详细信息,请参阅Bash FAQ 50,"I'm trying to put a command in a variable, but the complex cases always fail!"。
要回答文字问题,\$$
对于输出字符串$$
非常有用,而不是将其扩展为当前进程ID:
# The exact output will vary
$ echo $$
86542
# Literal quotes
$ echo \$\$
$$
# Escaping either quote is sufficient
$ echo \$$ $\$
$$ $$