我时常会抨击bash脚本,这让我印象深刻,这里有几种设置变量的方法:

key=value
env key=value
export key=value


当您在脚本中或单个命令(例如,我经常用Wine启动器链接一个变量以设置正确的Wine前缀),这些命令似乎是完全可以互换的,但是肯定不是这种情况。

是什么这三种方法之间的区别,您能举个例子说明我何时特别想使用每种方法吗?

与VAR = ...`和`export之间有什么区别VAR = ...`?但我想知道env也适用于此,并且一些示例也可以很好地说明每个优点:)

评论

请注意,export key = value是扩展语法,不应在可移植脚本(即#!/ bin / sh)中使用。

#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