linux基础-环境变量

266 阅读3分钟

shell与环境变量

bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。

在bash shell中,环境变量分为两类:

  • 全局变量
  • 局部变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。

在你登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。bash检查的启动文件取决于你启动bash shell的方式。启动bash shell有3种方式:

  • 登录时作为默认登录shell
  • 作为非登录shell的交互式shell
  • 作为运行脚本的非交互shell

登录 shell

当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:

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

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。另外4个启动文件是针对用户的,可根据个人需求定制。

/etc/profile

/etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统,bash就会执行/etc/profile启动文件中的命令。

每个发行版的/etc/profile文件都有不同的设置和命令。

$HOME/.profile

$HOME目录下的启动文件,提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个启动文件中的一到两个:

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

它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动bash shell会话时生效。

shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:

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

注意,这个列表中并没有$HOME/.bashrc文件。这是因为该文件通常通过其他文件运行的。

$HOME表示的是某个用户的主目录。它和波浪号(~)的作用一样。

交互式 shell 进程

如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。

如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

bashrc文件有两个作用:一是查看/etc目录下通用的bashrc文件,二是为用户提供一个定制自己的命令别名和私有脚本函数的地方。

全局环境变量

系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。要查看全局变量,可以使用env或printenv命令。

env/printenv

printenv显示所有(全局)环境变量

$ printenv 
HOSTNAME=server01.class.edu 
SELINUX_ROLE_REQUESTED= 
TERM=xterm 
SHELL=/bin/bash 
HISTSIZE=1000 
[...] 
HOME=/home/Christine 
LOGNAME=Christine 
[...] 
G_BROKEN_FILENAMES=1 
_=/usr/bin/printenv

也可以单独显示

$ printenv HOME 
/home/Christine 
$

也可以使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符($)。

$ echo $HOME 
/home/Christine 
$

设置用户定义变量

设置局部用户定义变量

echo

一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。

$ echo $my_variable 
$ my_variable=Hello 
$ 
$ echo $my_variable 
Hello

现在每次引用my_variable 环境变量的值,只要通过$my_variable引用即可。如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。

所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。

变量名、等号和值之间没有空格

设置全局环境变量

export

在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过export命令来完成,变量名前面不需要加$

$ my_variable="I am Global now" 
$ 
$ export my_variable 
$ 
$ echo $my_variable 
I am Global now 
$ 
$ bash 
$ 
$ echo $my_variable 
I am Global now 
$ 
$ exit 
exit 
$ 
$ echo $my_variable 
I am Global now 
$

在定义并导出局部环境变量my_variable后,bash命令启动了一个子shell。在这个子shell中能够正确的显示出变量my_variable的值。该变量能够保留住它的值是因为export命令使其变成了全局环境变量。

修改子shell中全局环境变量并不会影响到父shell中该变量的值。

删除环境变量

unset

在unset命令中引用环境变量时,不要使用$。

$ echo $my_variable 
I am Global now 
$ 
$ unset my_variable 
$ 
$ echo $my_variable 
$

默认的 shell 环境变量

默认情况下,bash shell会用一些特定的环境变量来定义系统环境。这些变量在你的Linux系统上都已经设置好了,如HOME、PATH。bash shell源自当初的Unix Bourne shell,因此也保留了Unix Bourne shell里定义的那些环境变量

image.png

......

设置 PATH 环境变量

当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。

$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: 
/sbin:/bin:/usr/games:/usr/local/games 
$

输出中显示了有8个可供shell用来查找命令和程序。PATH中的目录使用冒号分隔。如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。

因此,如果执行外部可执行程序等命令,最好在PATH中设置执行路径

PATH中各个目录之间是用冒号分隔的。只需引用原来的PATH值,然后再给这个字符串添加新目录就行了。

$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: 
/sbin:/bin:/usr/games:/usr/local/games 
$ 
$ PATH=$PATH:/home/christine/Scripts 
$ 
$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/ 
 games:/usr/local/games:/home/christine/Scripts 
$ 
$ myprog 
The factorial of 5 is 120. 
$

对PATH变量的修改只能持续到退出或重启系统。

内容来源

[1] [美] Richard Blum Christine Bresnahan.Linux命令行与shell脚本编程大全(第3版).北京人民邮电出版社,2016.