POSIX shell语法是怎样的 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10
接受带有赋值的简单命令,例如:
FOO=bar foobar
这里的第一个单词必须被ASSIGNMENT_WORD
规则 7b 接受为标记(尽管没有明确指定该规则适用于涉及 的产生式ASSIGNMENT_WORD
,但我想这是可以理解的)。
那么第二个词就没办法接受了。尝试减少它的唯一方法是使用cmd_word
产生式,但这需要规则 7b 说这是 aWORD
并且规则 7b 没有对不包含 的单词进行任何说明=
。
必须在规则 7b 中添加如下声明:
If the TOKEN does not contain `=` then it is a `WORD`.
如果没有这个,当前编写的语法就是错误的。我对么?
答案1
语法只会分配一个单词;之后的连续单词将被视为命令。
请记住,您引用的规则是指TOKEN
,并且不能包含未加引号的空格。看2.3 令牌识别,例如,
- 如果当前字符是不带引号的
<blank>
,任何包含前一个字符的标记都会被定界,并且当前字符将被丢弃。
答案2
我相信这个地址直接回答了你的问题:
2.10.2 Shell语法规则
[命令名称]
当 TOKEN 恰好是保留字时,将产生该保留字的令牌标识符。否则,应返回令牌 WORD。
这是规则 1,早于规则 7。任何单个单词(不包含=
)都将被解释为“命令名称”。如果它包含=
,则应用规则 7。
可能有人会说,规则 1 没有包含 = 的例外情况,但我想这应该从“的描述中假设出来”简单命令”:
2.9.1 简单命令
“简单命令”是一系列可选的变量分配和重定向,可以任意顺序,可选地后跟单词和重定向,并由控制运算符终止。
简而言之:“变量赋值”“单词”“重定向”
并且:“变量赋值”应包含一个=
.