我的理解是set
用于设置shell变量。和.. 这是我的理解,export
是设置环境变量。为什么“未设置”对环境变量有效?
那么,有没有很好的理由为什么unset
会删除环境变量,但不是shell变量?
E.g.当我通过export VAR='something'
输出一个变量时,我可以做unset VAR
,我做printenv
,我发现它不再被列出。
但是,我找不到删除局部变量的等价物?或者是unset
是不恰当的?谢谢。
我的理解是set
用于设置shell变量。和.. 这是我的理解,export
是设置环境变量。为什么“未设置”对环境变量有效?
那么,有没有很好的理由为什么unset
会删除环境变量,但不是shell变量?
E.g.当我通过export VAR='something'
输出一个变量时,我可以做unset VAR
,我做printenv
,我发现它不再被列出。
但是,我找不到删除局部变量的等价物?或者是unset
是不恰当的?谢谢。
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
命令具有非常与变量无关。
不带参数的'export'是'declare -x'的同义词。 (通常'export'和'declare -x'做同样的事情,但只有'export'是posix。)如果你想看到单个变量(shell或环境)的定义,你可以使用'declare -p varname '(如果未定义'varname',则将状态码设置为非零)。 – rici
好; Bash可以做到自己喜欢的东西,但有时候Bourne shell更容易理解,这是其中的一种。 –
'未设置的VAR'将取消设置该变量是本地还是环境变量。试试:'VAR = xyz;组;未设VAR; set'并且注意VAR出现在'set'的第一批输出中,而不是在第二批中。 –
'export'只是'注释'变量为待导出;它是*相同的*变量,受同样方式的'unset'影响。 – user2864740
这些链接可能有助于阐明:[在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