在bash中使用\ $$有什么用?

时间:2016-02-21 13:23:53

标签: bash unix

我发现这是一个如何将“eval”的输出存储到一个名为line的变量的建议。那么,\$$的用途是什么?

command = "some command"
line = $(eval \$$command)

1 个答案:

答案 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 \$$ $\$
$$ $$