Bash
手册上说Expansion is performed on the command line after it has been split into words.
。然而,在下一句中,它指出执行了七种扩展,并且word splitting
是第六种。据我了解,这两个是不同的分词。这两种分词有什么区别?
答案1
只有一分词,它发生了后大括号扩展、波形符扩展、参数和变量扩展、命令替换和算术扩展,但是前路径名扩展。
(暗示:单词拆分将单词拆分为更多单词。您将单词拆分与最初将命令行拆分为标记相混淆。)
|
首先,命令行被分成由元字符、&
、;
、(
、)
、<
、>
、 <space> 和 <tab>分隔的单词(或“标记”) 。然后,代表命令行的单词被解析为列表、管道和简单命令。
当考虑执行每个简单命令时,就会发生扩展。
完成大括号扩展、波形符扩展、参数和变量扩展、命令替换和算术扩展后,shell 会遍历未加引号的扩展结果并将它们拆分为单词,这次由
$IFS
(中的字符分隔)不是用于分割命令行的元字符)。最后,shell 再次遍历未加引号的扩展结果列表并执行路径名扩展。
阅读 POSIX 规范中的所有血腥细节外壳命令语言。 (POSIX 描述了一个稍微简单一些的 shell;Bash 实现了一些扩展,但应该很容易看出它们如何适合。)
回答所提出的问题:将命令行初始分割为由 shell 元字符分隔的标记;单词拆分将扩展结果拆分为由 中的字符分隔的单词$IFS
。