env、setenv、export 和何时使用有什么区别?

Mar*_*shi 27 shell bash environment-variables

最近我注意到我们有 3 个选项来设置环境变量:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

如果有其他方法,请赐教。

我什么时候应该更喜欢一个?请提出指导方针。

至于 shell 兼容性,哪个是最广泛的(涵盖更多的 shell 方言)?

我已经注意到这个答案,但我想用env使用偏好指南来扩展这个问题。

Gil*_*il' 30

export VARIABLE_NAME='some value'是设置环境变量在任何符合POSIX标准壳(方式shdashbashksh,等;也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 不导入的具有无效名称的变量。


use*_*253 9

设置像不修改环境变量这样的变量VAR='asdf',意味着您在同一会话中启动的程序将一无所知VAR并且无法访问它。在编写 shell 脚本时您需要这种行为。

export另一方面,是一个 bash 内置命令,可以修改环境,从而使导出的变量对当前会话中生成的子进程可见。您可以通过运行来实现相同的目的VAR='asdf' %program_name%

env不是内置程序,而是一个单独的程序。从表面上看,它的工作原理与您的操作完全相同VAR='asdf' %program_name%,但在较低级别,事情会变得更加复杂。首先,env启动。它修改环境,然后使用给定参数执行命令。您可以通过使用exec(3)系统调用在自己的代码中实现相同的行为。

setenvexport正如您的回答所述,仅在 csh-family shell 中。

  • 在现代 shell 中,如果环境中已经存在“VAR”,则“VAR=asdf”会更新环境。(在最初的 Bourne shell 中并非如此。) (2认同)