一、什么是环境变量
bash shell用一个称作环境变量的特性来存储有关shell会话和工作环境的信息。它允许你在内存中存储数据,以便运行在shell上的程序和脚本访问。这也是存储永久数据的一种简便方法,这些数据可以是用来识别用户账户、系统、shell的特性以及任何其他你需要存储的数据。
bash shell中环境变量分为两类:
1. 全局变量
2. 局部变量
注意:尽管bash shell使用一致的专有环境变量值,但不同的Linux发行版经常会添加它们自有的环境变量。
二、全局环境变量和局部环境变量
2.1 全局环境变量
全局环境变量不仅对shell会话可见,对所有shell创建的子进程也可见。局部变量则只对创建它们的shell可见。Linux系统在开始bash会话之前就设置了一些全局环境变量。系统环境变来那个一律使用全大写字母来区别于普通用户的环境变量。
查看全局变量,可用printenv命令。
系统为bash shell设置了很多全局环境变量。它们中的大部分都是系统在用户登录系统时设置的。要显示单个环境变量的值,可用echo命令。
例如:
$ echo $HOME
/home/user
$
全局环境变量在当前shell会话的子进程中也是可见的:
$ bash # bash命令启动一个新的shell
$ echo $HOME
/home/user #HOME环境变量的值在子shell进程中依然存在
$
2.2 局部环境变量
局部环境变量只能在定义它们的进程中可见。
在Linux中没有只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,除去全局环境变量其余的都是局部环境变量。
三、设置环境变量
3.1 设置局部环境变量
一旦启动了bash shell或者执行一个shell脚本,就可以创建在这个shell进程内可见的局部变量了。可以用等号来给环境变量赋值,值可以是数值或字符串:
$ test=testing #变量名称、等号和值之间没有空格
$ echo $test #引用变量的值的时候在变量名前加$符号
testing
$
系统环境变量都是用大写字母。自己定义的局部变量建议使用小写字母,便于区分。
设置了局部环境变量之后,就能在shell进程的任何地方使用它了。但是,如果创建了另外一个shell,它在子shell中就不可用了。
$ bash #创建子shell
$ echo $test
#test环境变量在子shell中不可见
$ exit
$ echo $test
testing
$
3.2 设置全局环境变量
全局环境变量在设定了全局环境变量的进程创建的所有子进程中都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局变量中。这个过程用export命令实现:
$ echo $test
testing
$ export test #导出环境变量test,将它变成全局的变量
$ bash
$ echo $test
testing
$
三、 删除环境变量
可以用unset命令来删除环境变量。
如果是在子进程中删除了一个全局环境变量,它只对子进程有效,该全局环境变量在父进程中依然有效。
四、默认shell环境变量
五、设置PATH环境变量
六、定位系统环境变量
在登录Linux系统启动一个bash shell时,默认情况下bash在几个文件中查找命令。这些文件称为启动文件。bash检查的启动文件取决于bash shell的方式。启动的bash shell有三种方式:
1. 登录时当做默认登录shell
2. 作为非登录shell的交互式shell
3. 作为运行脚本的非交互shell
6.1 登录shell
登录Linux系统时,bash shell会作为登录shell启动。登录shell会从4个不同的启动文件里读取命令。
/etc/profile
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。另外3个启动文件是用户专有的,可以根据每个用户的具体需求定制。
1. /etc/profile文件
/etc/profile文件是bash shell的主启动文件。只要登录了Linux系统,bash就会执行/etc/profile文件中的命令。
profile文件还有一个复杂的特性,它有个for语句,会逐一访问位于/etc/profile.d目录的每个文件。它为Linux系统提供了一个集中存放用户登录时要执行的应用专属的启动文件的地方。
大部分应用会创建两个启动文件:一个给bash shell(使用.sh扩展名),一个给c shell(使用.csh扩展名)。
例如lang.csh和lang.sh文件会尝试去判定系统上所采用的默认语言文字集,然后正确设置LANG环境变量。
2. $HOME目录下的启动文件
剩下的3个启动文件都起着同一个作用:提供一个用户专属的启动文件来定义用户专有的环境变量。大多数Linux发行版只用这3个启动文件中的一个:
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
这3个文件都是隐藏文件,在用户的HOME目录下,用户可以编辑这些文件并添加自己的环境变来给他们启动的每个bash shell会话用。