参数展开的行为

时间:2018-04-18 20:42:02

标签: bash shell quoting

我一直认为使用$foo之类的参数扩展,shell会在执行命令之前用参数的内容替换$foo。 例如,如果我设置

foo='`'

为什么呢,

ls $foo

有不同的行为
ls `

1 个答案:

答案 0 :(得分:5)

bash在处理命令行时有几个不同的阶段。这里相关的是解析阶段和扩展阶段。阶段 按顺序发生,并且在前一阶段完成之前不会开始一个阶段。

在第一个示例中,解析器从未看到反引号;这是由解析完成后发生的$foo扩展提供的。因此,将文字反引用作为参数传递给ls

在第二个例子中,解析器看到一个不带引号的反引号,表示命令替换的开始。