2015-06-08 48 views
0

我的理解是set用于设置shell变量。和.. 这是我的理解,export是设置环境变量。为什么“未设置”对环境变量有效?

那么,有没有很好的理由为什么unset会删除环境变量,但不是shell变量?

E.g.当我通过export VAR='something'输出一个变量时,我可以做unset VAR,我做printenv,我发现它不再被列出。

但是,我找不到删除局部变量的等价物?或者是unset是不恰当的?谢谢。

+1

'未设置的VAR'将取消设置该变量是本地还是环境变量。试试:'VAR = xyz;组;未设VAR; set'并且注意VAR出现在'set'的第一批输出中,而不是在第二批中。 –

+0

'export'只是'注释'变量​​为待导出;它是*相同的*变量,受同样方式的'unset'影响。 – user2864740

+0

这些链接可能有助于阐明:[在bash中环境变量和导出的环境变量之间的区别](http://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables- in-b),[bash-builtins'set'和'export'是做什么的?](http://unix.stackexchange.com/questions/71144/what-do-the-bash-builtins-set-and -export-DO)。请注意,具体可能会因其他shell(Bourne,Korn等)而异。请注意,“set”基本上是一种“不同”的野兽。 – paulsm4

回答

1

unset VAR将取消设置该变量是本地还是环境变量。尝试:即VAR出现在第一批输出的set并没有在第二

$ set | grep '^VAR=' 
$ VAR=xyz 
$ set | grep '^VAR=' 
VAR=xyz 
$ unset VAR 
$ set | grep '^VAR=' 
$ 

注意。

由于历史原因,如果没有别的,你可以创建一个变量,然后导出它。击似乎有这反映在下面的测试订正grep用于export一个不相称精心输出格式:

$ unset VAR 
$ export | grep '^declare -x VAR=' 
$ VAR=xyz 
$ set | grep '^VAR=' 
VAR=xyz 
$ export | grep '^declare -x VAR=' 
$ export VAR 
$ export | grep '^declare -x VAR=' 
declare -x VAR="xyz" 
$ unset VAR 
$ export | grep '^declare -x VAR=' 
$ 

在Bourne shell和它的衍生物(POSIX,光辉,击等)的set命令具有非常与变量无关。

+0

不带参数的'export'是'declare -x'的同义词。 (通常'export'和'declare -x'做同样的事情,但只有'export'是posix。)如果你想看到单个变量(shell或环境)的定义,你可以使用'declare -p varname '(如果未定义'varname',则将状态码设置为非零)。 – rici

+0

好; Bash可以做到自己喜欢的东西,但有时候Bourne shell更容易理解,这是其中的一种。 –