程序的正常工作离不开各种变量,例如要将某个选项设置为打开,又或者让程序找到所需的代码库,都需要使用变量。在 bash 中运行程序的时候会生成一个子 shell,这个子 shell 和执行原程序的父 shell 并不是完全一样的,只是继承了父 shell 的部分内容,而且默认是不继承父 shell 中的变量的。因为变量默认情况下是局部变量,出于安全原因,一个 shell 中的局部变量不会被另一个 shell 读取到,即使是子 shell 也不可以。
下面举一个例子。首先定义一个变量:
robots="R2D2 & C3PO"
然后执行:
bash
现在是在 bash shell 中创建了一个子 shell。
执行这个命令看看还能不能读取到刚才定义的变量:
echo $robots
你会发现读取不到。
还是在这个子 shell 中,为 robots 变量赋一个不同的值:
robots="These aren't the ones you are looking for"
再读取一次:
$ echo $robots
These aren't the ones you are looking for
退出这个子 shell:
exit
然后再看一下现在 robots 变量的值:
$ echo $robots
R2D2 & C3P0
这一个特性可以有效避免配置过程中产生混乱,同时也会导致一个问题:如果程序中需要设置变量,但却由于子 shell 的原因无法正常访问到这个变量,该如何解决呢?这个时候就需要用到 export 了。
重复一次刚才的过程,但这一次不是通过 robots="R2D2 & C3PO" 方式来设置变量,而是使用 export 命令:
export robots="R2D2 & C3PO"
现在你会发现,在进入子 shell 之后,robots 变量的值仍然是最初赋予的值。
要注意的是,尽管子 shell 会继承通过 export 导出的变量,但如果在子 shell 中对这个变量重新赋值,是不会影响到父 shell 中对应变量的。
如果要查看所有通过 export 导出的变量,可以执行以下命令:
export-p
自定义的变量会显示在这个列表的末尾。这个列表中还有一些常见的变量:例如 USER 的值是当前用户的用户名,PWD 的值是当前用户当前所在的目录,而 OLDPWD 的值则是当前用户上一个访问过的目录。因此如果执行:
cd-
就会切换到上一个访问过的目录,那是因为 cd 命令读取到了 OLDPWD 变量的值。
你也可以使用 env 命令查看所有环境变量。
如果要取消导出一个变量,可以加上 -n 参数:
export-n robots
接下来了解过环境变量的知识之后,你已经到达了可能对自己和他人造成危险的水平,接下来就需要了解如何通过使用别名来让环境变得更安全、更友好以保护自己了。
via: https://www.linux.com/blog/learn/2018/12/bash-variables-environmental-and-otherwise