Linux 中很多程序和脚本都是通过环境变量来获取系统信息或者存储临时数据的,所以知道如何设置环境变量对于从事 Linux 开发或者运维是相当重要的。本片文章将讲解什么是环境变量,它们存储在哪,如何使用和自定义环境变量。
什么是环境变量?
环境变量其实原理上讲是一块常驻内存的数据,可以方便让所有程序或者Shell 脚本快速访问。环境变量从作用域范围来讲,可以分为:
1. 全局环境变量:父 Shell 和子 Shell 都可以访问,具有传递效应,为子 Shell 访问父 Shell 的信息提供了一个便利的途径。可以通过命令查看当前系统环境变量:
printenv #显示当前系统的环境变量
图1
2. 局部环境变量:只能在创建该局部环境变量的 Shell 中使用,也就是说局部环境变量不具有可传递性,该 Shell 创建的子 Shell 无法访问父 Shell 创建的局部环境变量。比较遗憾的是也没有专用于查看局部环境变量的命令,不过可以通过 set 命令查看所有环境变量,包括全局环境变量,局部环境变量以及自定义环境变量。
set #显示所有环境变量
自定义环境变量
1.自定义局部环境变量:定义局部变量比较简单,类似编程中定义的栈变量,如下
local_var="hello world" #等号两侧不能有空格echo $local_var #使用变量时应在变量名前加’$‘符号输出:hello world
2.自定义全局环境变量:全局环境变量可以让其创建的所有子 Shell 进程可见,创建的方式是先创建一个局部环境变量,然后 export 这个局部环境变量,这样就可以让其创建的所有子 Shell 进程都可见这个环境变量。如图:
图2
如图所示,先创建了一个 "global_var" 局部变量,然后 "export global_var" 变成全局环境变量,然后创建了子进程 dash, 通过 ps --forest 查看父子进程关系,然后在子进程 dash 中打印全局变量。
注意,这里面比较有趣的是如果你在子进程中修改了从父进程传递过来的全局环境变量,这个修改也只在子进程中有效,对父进程中的全局环境变量并没有影响。所以其实父进程传递的全局变量并非真正意义上的全局环境变量,其行为类似于 C++调用函数时采用值传递传入函数参数一样,只是利用传递的参数在被调用函数栈中创建了临时的栈变量,在被调用函数栈内对参数的修改并不会影响调用函数传递的参数本身。直接上图解释:
图3
图3 承接 图2,可以看到在子进程 dash 中修改了全局环境变量 global_var="modify global var