参数扩展的行为

hum*_*235 3 bash shell quoting

我一直认为,通过参数扩展,例如$foo,shell $foo在执行命令之前会替换参数的内容.例如,如果我设置了

foo='`'
Run Code Online (Sandbox Code Playgroud)

为什么呢

ls $foo
Run Code Online (Sandbox Code Playgroud)

有不同的行为

ls `
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

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

在第一个例子中,解析器永远不会看到反引号; $foo解析完成后,由扩展提供.因此,将文字反ls引用作为参数传递.

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