bash 中扩展前的分词和扩展期间的分词之间的区别?

bash 中扩展前的分词和扩展期间的分词之间的区别?

Bash手册上说Expansion is performed on the command line after it has been split into words.。然而,在下一句中,它指出执行了七种扩展,并且word splitting是第六种。据我了解,这两个是不同的分词。这两种分词有什么区别?

答案1

只有分词,它发生了大括号扩展、波形符扩展、参数和变量扩展、命令替换和算术扩展,但是路径名扩展。

(暗示:单词拆分将单词拆分为更多单词。您将单词拆分与最初将命令行拆分为标记相混淆。)

  1. |首先,命令行被分成由元字符、&;()<>、 <space> 和 <tab>分隔的单词(或“标记”) 。

  2. 然后,代表命令行的单词被解析为列表、管道和简单命令。

  3. 当考虑执行每个简单命令时,就会发生扩展。

    • 完成大括号扩展、波形符扩展、参数和变量扩展、命令替换和算术扩展后,shell 会遍历未加引号的扩展结果并将它们拆分为单词,这次由$IFS(中的字符分隔)不是用于分割命令行的元字符)。

    • 最后,shell 再次遍历未加引号的扩展结果列表并执行路径名扩展。

阅读 POSIX 规范中的所有血腥细节外壳命令语言。 (POSIX 描述了一个稍微简单一些的 shell;Bash 实现了一些扩展,但应该很容易看出它们如何适合。)

回答所提出的问题:将命令行初始分割为由 shell 元字符分隔的标记;单词拆分将扩展结果拆分为由 中的字符分隔的单词$IFS

相关内容