我一直认为使用$foo
之类的参数扩展,shell会在执行命令之前用参数的内容替换$foo
。
例如,如果我设置
foo='`'
为什么呢,
ls $foo
与
有不同的行为ls `
?
答案 0 :(得分:5)
bash
在处理命令行时有几个不同的阶段。这里相关的是解析阶段和扩展阶段。阶段
按顺序发生,并且在前一阶段完成之前不会开始一个阶段。
在第一个示例中,解析器从未看到反引号;这是由解析完成后发生的$foo
扩展提供的。因此,将文字反引用作为参数传递给ls
。
在第二个例子中,解析器看到一个不带引号的反引号,表示命令替换的开始。