在 POSIX 7 中,shell 语法(XCU 中的第 2.10 节)提到了几个令牌标识符。我对两个感到困惑:单词和名称。他们有什么区别?
例如,命令的选项是 WORD 还是 NAME?命令的非可选参数怎么样?
答案1
本节中的所有大写名称均指(可能是机器可编译的)lex
语法描述(从2.10.外壳语法)。所询问的功能在第 5 项中进行了澄清:
[
NAME
在for
]
当。。。的时候TOKEN
满足名称要求(参见XBD名称)代币标识符NAME
将会产生结果。否则,令牌WORD
应被退回。
即(指3.231 名称), ANAME
是某种类型的WORD
:
在 shell 命令语言中,单词仅由可移植字符集中的下划线、数字和字母组成。 a 的第一个字符姓名不是数字。
并非所有单词都是名称:十进制整数是单词,但不是名称。
关于语法,这些行告诉了yacc
符号常量(通过#define
)lex
可能返回什么:
%token WORD
%token ASSIGNMENT_WORD
%token NAME
%token NEWLINE
%token IO_NUMBER
而yacc
语法(规则)开头为
%start complete_command
您可能会注意到语法中 出现了WORD
和。期望在这些点返回那些符号常量。按照惯例,大写名称用于此目的,其他名称只是语法中的规则。NAME
yacc
lex
yacc
解释命令时,shell 解释器只关心第一个 WORD,它期望它是 NAME。它将其他 WORD 作为参数传递给命令,并且命令必须决定它们的含义。这方面的语法yacc
很模糊,但请注意对“7a”的引用。书面标准中没有对此进行标记的项目,但它已移交给2.9.1 简单命令对应于语法中的这个簇:
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
(作为练习,有人可能会尝试完成语法并使其真正匹配术语标准)。
答案2
命令行处理方面的单词通常被理解为许多语言中的单词:(大部分)受空格限制的一组字符。
从技术上讲,是由元字符(未加引号时分隔单词的字符)分隔的一组字符。
第一步从命令行处理的非常清晰的描述:
- 将命令拆分为由固定元字符集分隔的标记:SPACE、TAB、NEWLINE、;、(、)、<、>、| 和 &。标记的类型包括单词、关键字、I/O 重定向器和分号。
后该线已分为字(或标记),标记使用语法规则进行识别并相应地进行标记。
名称只是用于标识某些内容的标签:命令名称、变量名称、参数名称、内置名称等。