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
。
现在,至少在env
GNU系统上实现,FreeBSD和Solaris 11中,我才知道他们是不等价的,因为env
允许任何字符,除了=
和\0
在var
名称:
$ 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 是否允许?
那么,在表单中允许任意名称的目的
env var=value
是什么,POSIX 是否允许?
引用POSIX:环境变量:
POSIX.1-2008 的 Shell 和 Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和可移植字符集中定义的字符中的 ( '_' ) 组成,并且不以数字开头。实现可能允许其他字符;应用程序应容忍此类名称的存在。
注意:其他应用程序可能难以处理以数字开头的环境变量名称。因此,不建议在任何地方使用此类名称。
因此, 的实现env
可能允许任意环境变量名称 - 大多数(如果不是全部)实现都这样做,接受 an 左侧的每个非 NUL 字符'='
- 并且其他实用程序(例如 shell)的实现可能允许也可能不允许任意名称。
只有当和 shell的实现都允许是环境变量时,name=value ... utility
等效于的语句env var="value" utility
才会为真。env
name
这里有一个关于这个问题的有趣 Austin Group 线程:Invalid shell assignments in environment。提到的一点是,shell 通常只允许名称可以表示为 shell 变量的环境变量。该线程中的几个参与者参与了 unix.stackexchange.com 并希望可以添加一些有关该问题的更多信息。
归档时间: |
|
查看次数: |
437 次 |
最近记录: |