历史扩展什么时候发生?
来自 bash 手册
将字符括在双引号 ('"') 中会保留引号内所有字符的字面值,但 '$'、'`'、'\' 以及启用历史扩展时的'!' 除外。
由于解析器在解析阶段识别出双引号,因此解析后必须进行历史扩展是否正确?
如果是,那么关于 shell 扩展(例如大括号扩展、参数扩展、文件名扩展等)何时发生?
但是我认为历史扩展是由shell的readline提供的,所以是在词法分析和解析之前处理的?就像 shell 中的自动完成一样。我错过了什么吗?
谢谢。
历史扩展什么时候发生?
来自 bash 手册
将字符括在双引号 ('"') 中会保留引号内所有字符的字面值,但 '$'、'`'、'\' 以及启用历史扩展时的'!' 除外。
由于解析器在解析阶段识别出双引号,因此解析后必须进行历史扩展是否正确?
如果是,那么关于 shell 扩展(例如大括号扩展、参数扩展、文件名扩展等)何时发生?
但是我认为历史扩展是由shell的readline提供的,所以是在词法分析和解析之前处理的?就像 shell 中的自动完成一样。我错过了什么吗?
谢谢。
引用bash 手册:
历史扩展是处理的第一阶段,甚至在 shell 解析之前,这就是双引号不保护的原因
!
:后者在双引号之前处理。它由历史库处理,它实现自己的解析,有几种保护历史运算符的方法:当 shell 的解析器开始处理一个字符串时,它已经被历史库解析并且历史扩展已经发生了。
正如@Stephen Kitt 所说,历史扩展应该在第一阶段完成。这种模式可以通过以下几点来理解:如果我们键入任意 bash 代码,例如
然后我们使用使用历史扩展,
很明显,上面的行将再次做同样的事情。我们应该注意的是,
!-1
将扩展到echo "the value of a is $a" > tmp
第一个。如果这种扩展发生在解析阶段之后,那么我们应该意识到$a
不会被正确解析,这实际上并没有发生。