env,setenv,export和何时使用之间有什么区别?


18

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

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

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

我什么时候比另一个更喜欢?请提出准则。

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

我已经注意到了这个答案,但是我希望扩大使用范围env和使用偏好指南。

Answers:


14

export VARIABLE_NAME='some value'是设置环境变量在任何符合POSIX标准壳(方式shdashbashksh,等;也ZSH)。如果变量已经具有值,则可以使用export VARIABLE_NAME它来使其成为环境变量而无需更改其值。

POSIX之前的Bourne外壳不支持此功能,这就是为什么您会看到避免export VARIABLE_NAME='some value'使用VARIABLE_NAME='some value'; export VARIABLE_NAME而代之以脚本的原因。但是,如今POSIX之前的Bourne外壳极为罕见。

setenv VARIABLE_NAME='some value'是用于设置环境变量的csh语法。setenv在sh中不存在,并且csh在脚本中极少使用,并且在过去20年中已被bash超越以进行交互使用(甚至zsh甚至更长),因此除非遇到它,否则您可以将其忘记。

env除了在shebang行中,该命令很少有用。在不带参数的情况下调用它时,它显示的是环境,但export效果更好(已排序,并且经常用引号将值中的换行与分隔值的换行消除歧义)。当参数调用,它运行额外的环境变量的命令,但没有相同的命令env也可以(VAR=value mycommand运行mycommandVAR设置为value,就像env VAR=value mycommand)。env在shebang行中有用的原因是它执行PATH查找,并且在使用命令名称调用时恰好不执行其他任何操作。该env命令对于仅使用几个环境变量运行命令很有用-i,或不带参数来显示环境,包括带有不会导入的无效名称的变量。


3

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

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

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

setenvexport如您的回答所述,它仅位于csh-family shell中。


2
在现代Shell中,VAR=asdf如果环境VAR中已经存在,则不会更新环境。(在原始的Bourne炮弹中并非如此。)
Gilles'SO-别再作恶了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.