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