Mar*_*shi 27 shell bash environment-variables
最近我注意到我们有 3 个选项来设置环境变量:
export envVar1=1setenv envVar2=2env envVAr3=3如果有其他方法,请赐教。
我什么时候应该更喜欢一个?请提出指导方针。
至于 shell 兼容性,哪个是最广泛的(涵盖更多的 shell 方言)?
我已经注意到这个答案,但我想用env使用偏好指南来扩展这个问题。
Gil*_*il' 30
export VARIABLE_NAME='some value'是设置环境变量在任何符合POSIX标准壳(方式sh,dash,bash,ksh,等;也ZSH)。如果变量已经有一个值,您可以使用export VARIABLE_NAME它使其成为环境变量而无需更改其值。
Pre-POSIX Bourne shell不支持这一点,这就是为什么您会看到避免export VARIABLE_NAME='some value'和使用脚本的原因VARIABLE_NAME='some value'; export VARIABLE_NAME。但 POSIX 之前的 Bourne shell 现在极为罕见。
setenv VARIABLE_NAME='some value'是设置环境变量的 csh 语法。setenvsh 中不存在,并且 csh 在脚本中极少使用,并且在过去的 20 年中被 bash 超越用于交互使用(而 zsh 甚至更长),因此除非遇到它,否则您可以忘记它。
env除了在shebang 行中,该命令很少有用。当不带参数调用时,它显示环境,但export效果更好(排序,并且经常引用以消除值中的换行符与分隔值的换行符的歧义)。当使用参数调用时,它会运行一个带有额外环境变量的命令,但不带的相同命令env也可以VAR=value mycommand运行(mycommand使用VARset to运行value,就像env VAR=value mycommand)。env在shebang行中有用的原因是它执行PATH查找,并且在使用命令名称调用时恰好不执行任何其他操作。该env命令对于运行只有几个环境变量的命令很有用-i,或不带参数来显示环境,包括 shell 不导入的具有无效名称的变量。
设置像不修改环境变量这样的变量VAR='asdf',意味着您在同一会话中启动的程序将一无所知VAR并且无法访问它。在编写 shell 脚本时您需要这种行为。
export另一方面,是一个 bash 内置命令,可以修改环境,从而使导出的变量对当前会话中生成的子进程可见。您可以通过运行来实现相同的目的VAR='asdf' %program_name%。
env不是内置程序,而是一个单独的程序。从表面上看,它的工作原理与您的操作完全相同VAR='asdf' %program_name%,但在较低级别,事情会变得更加复杂。首先,env启动。它修改环境,然后使用给定参数执行命令。您可以通过使用exec(3)系统调用在自己的代码中实现相同的行为。
setenvexport正如您的回答所述,仅在 csh-family shell 中。
| 归档时间: |
|
| 查看次数: |
46281 次 |
| 最近记录: |