bash 中哪个先运行?词法分析器,还是扩展器?

问题描述 投票:0回答:1

我正在尝试了解 bash 的解析器和词法分析器机制。 (我的最终目标是实现类似 bash 的 shell)。

第一个案例

$ test=‘o a’
$ ech”$test”
a

扩展器扩展了命令并找到了扩展后的参数。
扩展的完整命令:

echo a

因此,我可以假设词法分析器在扩展操作之后运行,因为 bash 理解“echo a”不是命令名称。 “echo”是命令名称,“a”是参数。 (顺便说一句 zsh 不要那样。)

第二种情况

$ test=“‘“
$ echo $test
‘

Echo 仅打印一个单引号。但是,如果我们将此字符串扩展为:

echo '
,则它不是有效命令,因为它有一个未闭合的引号。所以,我可以假设两件事:

  1. 首先,词法分析器理解它是什么,然后进行扩展。

  2. 实际上,'test'变量的值不是单引号。它的值正是:

    "'"
    。所以,实际上,我们不会扩展到
    echo '
    ,而是扩展到
    echo "'"
    ,这是有效的。

但是第一个假设和第一个测试用例的假设并不重合。所以,我假设是第二个。

第三个 案例

$ test=“‘“
$ echo “$test”
‘

Echo 再次只打印一个单引号。但是,(我假设)它将这个字符串扩展为:

echo ""'""
,这是无效的,因为我们有一个未闭合的引号。

所以,我的问题是:“bash 如何理解我的意思?”

bash parsing lexer expander
1个回答
0
投票

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 .

© www.soinside.com 2019 - 2024. All rights reserved.