Linux之环境变量
本文将介绍Linux中的环境变量

查看全局环境变量
环境变量大体可以分为两类:全局环境变量、局部环境变量。前者变量名通常使用大写字母,后者变量名通常使用小写字母。可通过下述env、printenv命令查看当前所有的全局环境变量
# 当前所有的全局环境变量
env
# 当前所有的全局环境变量
printenv


此外,利用printenv命令还可以查看指定的全局环境变量
# 查看指定的全局环境变量
printenv <全局环境变量名>

查看局部环境变量
对于用户自定义的局部环境变量而言,则可以通过echo命令来查看。注意变量名前面需要加 $ 美元符号
# 查看指定的局部环境变量
printenv $<局部环境变量名>

事实上,echo命令对于查看指定的全局环境变量也是有效的
# 查看指定的全局环境变量
printenv $<全局环境变量名>

设置局部环境变量
可通过如下方式设置局部环境变量。需注意赋值符两边不能有任何空格。如果用于赋值的字符串包含空格,则必须用单引号或双引号进行包裹
# 设置局部环境变量
<变量名>=<变量值>
my_age=18
my_name="Aaron Zhu"

对于局部环境变量而言,其仅对当前Shell进程而言是有效的。故父Shell中的局部环境变量对于子Shell来说是无效的

子Shell中的局部环境变量对于父Shell来说同样也是无效的

设置全局环境变量
先创建局部环境变量,然后再将其导出到全局环境中。此时即为全局环境变量了
# 设置局部环境变量
<变量名>=<变量值>
# 将局部环境变量 导出 到全局环境中
export <变量名>

上述两条命令可以合二为一
# 设置局部环境变量, 并将该局部环境变量 导出 到全局环境中
export <变量名>=<变量值>

父Shell中设置的全局环境变量,对于子Shell是可见的

子Shell中设置的全局环境变量,对于父Shell则是不可见的

对于父Shell中设置的全局环境变量而言,如果在父Shell中对其进行修改,则会同步反映到子Shell当中;但如果在子Shell中对其进行修改,则不会同步反映到父Shell当中

持久化
事实上即使利用export命令创建了全局环境变量,其也仅对当前Shell及其子Shell有效。一旦当前Shell关闭,重新打开一个新的Shell后,我们还是需要再次重新定义,显然非常麻烦。故我们通常会将设置全局环境变量的命令写入到用户目录下的相关文件当中。这样全局环境变量就实现了对该用户的永久生效。因为一旦再次打开Shell时,该相关文件会被调用,完成对全局环境变量的设置
具体地,如果使用bash,则写入到 .bashrc 文件中;如果使用zsh,则写入到 .zshrc 文件中。这里我们以bash为例,一旦更新了用户目录下的.bashrc文件后,下次重新打开新Shell后就会发现全局环境变量生效了。如果期望在当前Shell中立即生效,只需执行source命令即可
# 重新读取.bashrc文件
source .bashrc

无论是全局环境变量,还是局部环境变量。均可通过下述方法进行删除
# 删除环境变量
unset <变量名>

对于父Shell中设置的全局环境变量而言,如果在父Shell中将其删除,则其所创建的子Shell中也会删除该环境变量

对于父Shell中设置的全局环境变量而言,如果在其所创建的子Shell中将其删除,则父Shell中并不会删除该环境变量,依然有效可用

在Linux中,我们最常接触的环境变量就是PATH。它定义了用于查找命令、程序的目录。如下所示,PATH中的目录之间使用:冒号分隔

日常使用中最多的操作就是新增路径到PATH环境变量当中,可通过如下方式实现。无须从头开始定义
# 向PATH环境变量中新增路径
export PATH=$PATH:<新路径1>:<新路径2>

- Linux命令行与shell脚本编程大全·第4版 Richard Blum、Christine Bresnahan著