在 POSIX shell 语法中 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10_02
规则 7b 包含以下声明
Otherwise, it is unspecified whether it is ASSIGNMENT_WORD or WORD that is returned.
这是什么意思?这是否意味着一个兼容的 shell,对于每个左侧=
不为空且不是有效名称的单词标记,例如:
,=
必须将其分类为ASSIGNMENT_WORD
或WORD
但不返回错误?
答案1
不:是的未指定将返回两个正常结果中的哪一个。由于未指定,因此实施可以产生错误(因为规范没有提到什么一定会发生,仅仅意味着只有两种选择),但规范并没有说这两种选择之一必须发生。它根本就没有说。
这种类型的措辞用于以下情况:某人想到的(可能是假设的)实现可能与其他实现不同,并且没有达成共识将其排除在标准之外。
该术语是在1.5 术语:
未指定
描述 POSIX.1-2008 未指定的值或行为的性质,这些值或行为是由于使用有效程序构造或有效数据输入而产生的。
值或行为可能因符合 POSIX.1-2008 的实现而异。应用程序不应依赖于值或行为的存在或有效性。无法保证依赖于任何特定值或行为的应用程序可以跨一致的实现进行移植。
它不太具体实施定义:
描述 POSIX.1-2008 未定义的值或行为但由实施者选择。值或行为可能因符合 POSIX.1-2008 的实现而异。应用程序不应依赖于值或行为的存在。无法保证依赖于此类值或行为的应用程序可以跨一致的实现进行移植。
答案2
它说:
foo=bar
是一个赋值词=foo
是一个词"foo"=bar
或者foo.bar=baz
可以是单词或者赋值词,POSIX 无论如何都不给你任何保证,所以你不应该使用它。- 这似乎暗示
"foo=bar"
(带引号)也未指定,这表明您不能(可移植)调用=
名称中带有 a 的命令(除了使用cmd=foo=bar; "$cmd" ...
),对我来说,这似乎是规范中的一个错误,因为没有我知道 shell 会将仅带引号的单词=
视为赋值。
在那些未指定的内容中,它确实说这两者之一必须发生因为除了将令牌识别为单词或_ASSIGNMENT_WORD_。
现在这只是描述标记化阶段。
那么根据语法,如果它是单词,那么这就是命令名称。如果未找到相应的命令,shell 可能会返回错误。
如果它是一个ASSIGNMENT_WORD,如果 shell 无法分配具有此类名称的变量,它仍然可能返回错误。
在实践中,您会发现有些 shell 允许:Stéphane=1
或foo.bar=baz
作为赋值,有些则不允许,然后会将它们视为命令名称。有些 shell 会将它们视为失败的分配。