$ unset foo
$ unset bar
$ echo $foo
$ echo $bar
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ foo=a
$ bar=b
$ export bar
$ echo $foo
a
$ echo $bar
b
$ PATH=
$ echo $PATH
$ /bin/bash
bash: lesspipe: No such file or directory
bash: dircolors: No such file or directory
bash: ls: No such file or directory
$ echo $foo
$ echo $bar
b
$ echo $PATH
$
正如我们所看到的,更改$PATH
会影响子 shell,而需要export
编辑另一个变量。为什么?
答案1
实际上有两种类型的变量:
- 环境变量
- 外壳变量
更复杂的是,它们看起来相同,并且可以使用命令将 shell 变量转换为环境变量export
。
该env
命令将显示当前的环境变量集。
$ myvar=100
$ env | grep myvar
$ export myvar
$ env | grep myvar
myvar=100
变量也可以在命令的生命周期内临时导出。
$ env | grep anothervar
$ anothervar=100 env | grep anothervar
anothervar=100
$ env | grep anothervar
$
当 shell 启动时,它会继承许多环境变量(可能为零)。
启动脚本(例如.bash_profile
,目录.bashrc
中的文件/etc
)也可以设置和导出变量。
最后,如果环境为空,shell 本身可以为环境变量设置默认值。例如
$ PATH=foo /bin/bash -c 'echo $PATH'
foo
$ PATH= /bin/bash -c 'echo $PATH'
$ unset PATH
$ /bin/bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
答案2
我建议你读一下这篇文章文章。
shell和环境变量之间有很大的区别。小路是环境因素之一,并且是已经导出(默认情况下),因此通过更改它,您使用的当前 shell 和所有其他 shell - 任何子 shell 或进程 - 将受到影响。
小路是系统在查找命令时将检查的目录列表。因此,即使您想更改它或向其中添加某些内容,最好使用它,PATH="$PATH:...
因为您需要具有用于执行命令的原始路径,但如果您完全更改它,则应该通过输入命令的绝对路径来使用命令,例如/bin/pwd
.
但富您导出的内容对 shell 或进程没有任何影响,我知道您正在尝试将其设为环境变量,但您尚未定义有效的内容,因此这就是为什么您看不到它对 shell 或进程产生什么影响其他的东西,事实上这是你因为你自己的需要而定义的,即跟踪一些临时数据,所以最好将它保留为一个 shell 变量。例如,当您尝试做一些数学项目时,您可能需要定义一些内容并在短时间内使用它们,因此您可以仅设置一些 shell 变量而无需导出它们。
我希望我能准确无误,但我仍然建议您阅读给定的文章,并尝试更改其中一些变量,以便您完全理解。顺便说一句,如果您希望环境变量是永久的,您应该将它们作为一行添加到您的.bashrc
或.bash_profile
.