Linux环境变量解疑

一、什么是环境变量

bash shell用一个称为环境变量的特性来存储有关shell会话和工作环境的信息。

环境变量有两类:全局变量局部变量
局部变量可以在这个shell进程和子进程中起作用,另创建一个shell,就无效了。

1.1 显示环境变量

  • 显示全局变量:printenv
  • 显示局部变量:set

1.2 设置环境变量

  • 设置局部变量:通过等号来给环境变量赋值,如

$test=testing
$echo $test
testing
$

  • 设置全局变量:通过将局部变量导出为全局变量的方式,如

$echo $test
testing a long string
$export test
$bash
$echo $test
testing a long string
$

1.3 删除环境变量

  • 局部变量:unset test
  • 全局变量:unset test 需要注意的是:如果你是在子进程中删除一个全局环境变量,它只对子进程失效。全局环境变量在父进程仍然有效。

二、系统环境变量

linux启动启动一个bash shell时,默认情况下bash在几个文件中查找命令。这些文件称为启动文件,根据bash shell启动方式的不同,查找文件不同

bash shell有三种方式:

2.1 登陆时当做默认登陆shell

会依次查找一下路径:

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

/etc/profile文件是系统上默认的bash shell的主启动文件。每个用户登陆都会执行这个启动文件,另外3个启动文件是用户专有的,可根据用户定制。

2.2 作为非登陆shell的交互式shell

如果你的bash shell不是登陆系统时启动的,称为交互式shell。

交互式shell不会去访问/etc/profile文件,而会去用户的HOME目录检查.bashrc是否存在。

.bashrc文件的作用
有两个作用:

  • 一是查看/etc目录下的公用bashrc文件
  • 二是为用户提供一个定制自己的命令别名和私有脚本函数的地方。
    (默认的文件会设置一些环境变量,但一般它没有执行export命令让它们称为全局的。)

记住,交互式shell的启动文件只会在每次有新的交互式shell启动时才运行,因此任何子shell都会自动执行这个交互式shell的启动文件。

还能看出,/etc/bashrc文件也会执行位于/etc/profile.d 目录下的那些应用专属的启动文件。

2.3 作为运行脚本的非交互shell

系统执行shell脚本时用的就是这种shell。

当你每次在系统上运行脚本时需要运行特定的启动命令。为了处理这种情况,bash shell提供了BASH_ENV环境变量。

当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定,shell会执行文件里的命令。
(在linux发行版里,默认情况下这个环境变量并未设置。)


参考:

(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)