为什么更改 $PATH 会影响子 shell,但更改 $foo 却不会?

为什么更改 $PATH 会影响子 shell,但更改 $foo 却不会?
$ 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

实际上有两种类型的变量:

  1. 环境变量
  2. 外壳变量

更复杂的是,它们看起来相同,并且可以使用命令将 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.

相关内容