key=value
env key=value
export key=value
当您在脚本中或单个命令(例如,我经常用Wine启动器链接一个变量以设置正确的Wine前缀),这些命令似乎是完全可以互换的,但是肯定不是这种情况。
是什么这三种方法之间的区别,您能举个例子说明我何时特别想使用每种方法吗?
与VAR = ...`和`export之间有什么区别VAR = ...`?但我想知道
env
也适用于此,并且一些示例也可以很好地说明每个优点:) #1 楼
让我们考虑一个具体的例子。grep
命令使用名为GREP_OPTIONS
的环境变量来设置默认选项。现在。鉴于文件
test.txt
包含以下几行:line one
line two
运行命令
grep one test.txt
将返回line one
如果使用带有
-v
选项的grep,它将返回不匹配的行,因此输出将是line two
我们现在尝试设置带有环境变量的选项。
GREP_OPTIONS='-v'
grep one test.txt
结果:
line one
显然,选项
export
没有传递给-v
。要当您仅为要使用的外壳设置变量时使用此格式,例如在
grep
中,您不想导出for i in * ; do
。但是,该变量会传递给环境该特定命令行的内容,因此您可以执行
GREP_OPTIONS='-v' grep one test.txt
,它将返回预期的
line two
,您可以使用此表单临时更改e
导出该变量会导致该变量被继承:
export GREP_OPTIONS='-v'
grep one test.txt
立即返回
line two
这是在shell中设置变量以供随后启动的进程使用的最常见方法
这一切都是在bash中完成的。
$i
是bash内置的; export
是bash语法。另一方面,VAR=whatever
本身就是一个程序。调用env
时,会发生以下情况:env
命令作为新进程执行。作为争论。将env
进程替换为env
进程。示例:
env GREP_OPTIONS='-v' grep one test.txt
此命令将启动两个新进程:(i)env和(ii)grep(实际上,第二个进程将替换第一个进程)。从
env
进程的角度来看,结果与运行完全相同。GREP_OPTIONS='-v' grep one test.txt
但是,如果您不在bash范围内或不想启动另一个shell(例如,当您使用
command
函数系列而不是grep
调用时。)关于
exec()
的附加说明这也是为什么成语
system()
使用而不是#!/usr/bin/env
。 #!/usr/bin/env interpreter
不需要程序的完整路径,因为它使用#!/usr/bin/interpreter
函数,该函数像shell一样搜索env
变量,然后由命令运行替换自身。因此,它可以用来找出解释器(如perl或python)在路径上的“位置”。这也意味着通过修改当前路径,您可以影响将调用哪个python变体。这使得以下操作成为可能:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
python
而不是运行Python,将导致
I am an evil interpreter!
评论
为什么GREP_OPTIONS ='-v'grep one test.txt有效?我以为它需要在'-v'之后加一个分号(但我尝试过,实际上它确实有效。)
–乔
2012年10月26日6:20
因为使用分号,它被解释为两个单独的bash命令;第一个设置变量(不导出变量),第二个以不导出变量的环境开始。但是,如果没有分号,这是一个命令(grep),其后是设置本地环境。
– 1月
2012年10月26日7:05
来自env的所有变量从何而来?我的意思是,当您打开一个新的外壳程序时,您总是会有一些变量。所以某些程序必须已经导出了这些,对吗?
– Pithikos
2014年10月30日14:05
@Pithikos环境变量是通过“采购环境”设置的。默认情况下,bash将获取系统范围的bashrc(或profile.d或bash_profile)。然后,它将为您的用户〜/ .bashrc(和/或〜/ .bash_profile)提供源。这些文件中的任何一个都可以包含bash命令以获取其他脚本的源代码,因此最终可以使环境变量来自各地。
–埃里克
16-3-3在21:27
set var = blah呢?
– CMCDragonkai
17年1月11日,3:20
评论
请注意,export key = value是扩展语法,不应在可移植脚本(即#!/ bin / sh)中使用。