参数扩展的行为
Behavior of parameter expansion
我一直以为用$foo
这样的参数扩展,shell在执行命令之前用参数的内容替换了$foo
。
例如,如果我设置
foo='`'
那为什么
ls $foo
与
有不同的行为
ls `
?
bash
在处理命令行时有几个不同的阶段。这里相关的是解析阶段和扩展阶段。阶段
按顺序发生,一个阶段直到前一个阶段完成才开始。
在第一个示例中,解析器 永远不会看到反引号;这是由解析完成后发生的 $foo
的扩展提供的。结果,文字反引号作为参数传递给 ls
。
在第二个示例中,解析器看到一个未加引号的反引号,表示命令替换的开始。
我一直以为用$foo
这样的参数扩展,shell在执行命令之前用参数的内容替换了$foo
。
例如,如果我设置
foo='`'
那为什么
ls $foo
与
有不同的行为ls `
?
bash
在处理命令行时有几个不同的阶段。这里相关的是解析阶段和扩展阶段。阶段
按顺序发生,一个阶段直到前一个阶段完成才开始。
在第一个示例中,解析器 永远不会看到反引号;这是由解析完成后发生的 $foo
的扩展提供的。结果,文字反引号作为参数传递给 ls
。
在第二个示例中,解析器看到一个未加引号的反引号,表示命令替换的开始。