我正在尝试了解 bash 的解析器和词法分析器机制。 (我的最终目标是实现类似 bash 的 shell)。
第一个案例
$ test=‘o a’
$ ech”$test”
a
扩展器扩展了命令并找到了扩展后的参数。
扩展的完整命令:
echo a
因此,我可以假设词法分析器在扩展操作之后运行,因为 bash 理解“echo a”不是命令名称。 “echo”是命令名称,“a”是参数。 (顺便说一句 zsh 不要那样。)
第二种情况
$ test=“‘“
$ echo $test
‘
Echo 仅打印一个单引号。但是,如果我们将此字符串扩展为:
echo '
,则它不是有效命令,因为它有一个未闭合的引号。所以,我可以假设两件事:
首先,词法分析器理解它是什么,然后进行扩展。
实际上,'test'变量的值不是单引号。它的值正是:
"'"
。所以,实际上,我们不会扩展到 echo '
,而是扩展到 echo "'"
,这是有效的。
但是第一个假设和第一个测试用例的假设并不重合。所以,我假设是第二个。
第三个 案例
$ test=“‘“
$ echo “$test”
‘
Echo 再次只打印一个单引号。但是,(我假设)它将这个字符串扩展为:
echo ""'""
,这是无效的,因为我们有一个未闭合的引号。
所以,我的问题是:“bash 如何理解我的意思?”
bash 中哪个先运行?词法分析器,还是扩展器?
莱克瑟。输入必须被标记化。只有在标记化之后,才能执行扩展,但是上下文(双引号、此处文档、反引号)与扩展相关。这也有记录https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions:
将其拆分为令牌后在命令行上进行扩展。
除了上述 bash 文档之外,您可能还想阅读 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01 .