env、setenv、export 之间有什么区别以及何时使用?

env、setenv、export 之间有什么区别以及何时使用?

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

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

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

我什么时候应该选择其中一种而不是另一种?请提出指导方针。

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

我已经注意到了这一点回答但我希望通过env使用偏好指南来扩展这个问题。

答案1

export VARIABLE_NAME='some value'sh是在任何 POSIX 兼容 shell( 、dashbashksh等;还有 zsh)中设置环境变量的方法。如果变量已经有值,则可以export VARIABLE_NAME将其设为环境变量,而无需更改其值。

POSIX 之前的版本伯恩炮弹不支持这一点,这就是为什么您会看到避免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命令很少有用,除了在舍邦线。当不带参数调用时,它会显示环境,但export效果更好(已排序,并且经常引用以消除值中的换行符和分隔值的换行符的歧义)。当使用参数调用时,它会运行带有额外环境变量的命令,但不使用相同的命令env也可以工作(使用set toVAR=value mycommand运行,就像)。 shebang 行有用的原因是它执行查找,并且在使用命令名称调用时它恰好不执行任何其他操作。该命令可用于运行仅包含几个环境变量(带或不带参数)的命令,以显示环境,包括 shell 不导入的无效名称的变量。mycommandVARvalueenv VAR=value mycommandenvPATHenv-i

答案2

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

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

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

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

答案3

相关内容