POSIX shell语法如何接受FOO=bar foobar

POSIX shell语法如何接受FOO=bar foobar

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 令牌识别,例如,

  1. 如果当前字符是不带引号的<blank>,任何包含前一个字符的标记都会被定界,并且当前字符将被丢弃。

答案2

我相信这个地址直接回答了你的问题:

2.10.2 Shell语法规则

  1. [命令名称]

    当 TOKEN 恰好是保留字时,将产生该保留字的令牌标识符。否则,应返回令牌 WORD。

这是规则 1,早于规则 7。任何单个单词(不包含=)都将被解释为“命令名称”。如果它包含=,则应用规则 7。

可能有人会说,规则 1 没有包含 = 的例外情况,但我想这应该从“的描述中假设出来”简单命令”:

2.9.1 简单命令

“简单命令”是一系列可选的变量分配和重定向,可以任意顺序,可选地后跟单词和重定向,并由控制运算符终止。

简而言之:“变量赋值”“单词”“重定向”

并且:“变量赋值”应包含一个=.

相关内容