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

Mot*_*001 6 shell path environment-variables variable

$ 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

$
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,更改$PATH会影响子shell,而另一个变量需要被export编辑。为什么?

Ste*_*ris 10

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

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

为了使事情更复杂,它们看起来都一样,并且可以使用export命令将 shell 变量转换为环境变量。

env命令将显示当前的环境变量集。

$ myvar=100
$ env | grep myvar
$ export myvar
$ env | grep myvar
myvar=100
Run Code Online (Sandbox Code Playgroud)

变量也可以在命令的生命周期内临时导出。

$ env | grep anothervar
$ anothervar=100 env | grep anothervar
anothervar=100
$ env | grep anothervar
$ 
Run Code Online (Sandbox Code Playgroud)

当 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:.
Run Code Online (Sandbox Code Playgroud)