为什么 `env var=value` 允许在 var 中使用任意名称?

cuo*_*glm 5 shell environment-variables

阅读env POSIX 文档

有些人认为 env 是多余的,因为通过以下方式实现了相同的效果:

名称=值 ... 实用程序 [ 参数 ... ]

当将环境变量添加到命令的环境中时,该示例等效于 env,但在将环境设置为给定值时则不一样。如果不带参数调用 env 实用程序还会写出当前环境。除了示例提供的功能之外,还有足够的功能来证明包含 env 是合理的。

AFAICT,上述语句的含义var=value command将与 相同env var="value" command,而在使用 as 时则不同env -i var="value" command

现在,至少在envGNU系统上实现,FreeBSD和Solaris 11中,我才知道他们是不等价的,因为env允许任何字符,除了=\0var名称:

$ env 'BASH_FUNC_foo%%=() { echo foo; }' bash -c foo
Run Code Online (Sandbox Code Playgroud)

打印foo,而您不能BASH_FUNC_foo%%='() { echo foo; }'在任何 shell 中使用,因为BASH_FUNC_foo%%显然不是有效的变量名。

在 POSIX shell 中,除了bash,这会留下一个BASH_FUNC_foo%%在环境变量中命名的变量,shell 无法访问它。

那么,在表单中允许任意名称的目的env var=value是什么,POSIX 是否允许?

Mar*_*ick 5

那么,在表单中允许任意名称的目的env var=value是什么,POSIX 是否允许?

引用POSIX:环境变量

POSIX.1-2008 的 Shell 和 Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和可移植字符集中定义的字符中的 ( '_' ) 组成,并且不以数字开头。实现可能允许其他字符;应用程序应容忍此类名称的存在。

注意:其他应用程序可能难以处理以数字开头的环境变量名称。因此,不建议在任何地方使用此类名称。

因此, 的实现env可能允许任意环境变量名称 - 大多数(如果不是全部)实现都这样做,接受 an 左侧的每个非 NUL 字符'='- 并且其他实用程序(例如 shell)的实现可能允许也可能不允许任意名称。

只有当和 shell的实现都允许是环境变量时,name=value ... utility等效于的语句env var="value" utility才会为真。envname

这里有一个关于这个问题的有趣 Austin Group 线程:Invalid shell assignments in environment。提到的一点是,shell 通常只允许名称可以表示为 shell 变量的环境变量。该线程中的几个参与者参与了 unix.stackexchange.com 并希望可以添加一些有关该问题的更多信息。