参数扩展的行为

Behavior of parameter expansion

我一直以为用$foo这样的参数扩展,shell在执行命令之前用参数的内容替换了$foo。 例如,如果我设置

foo='`'

那为什么

ls $foo

有不同的行为
ls `

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

在第一个示例中,解析器 永远不会看到反引号;这是由解析完成后发生的 $foo 的扩展提供的。结果,文字反引号作为参数传递给 ls

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