在linux中,环境变量指的是系统预定义的参数;它相当于全局变量,存在于所有的Shell中,具有继承性,可存储有关shell会话和工作环境的信息。
本教程操作环境:linux5.9.8系统、Dell G3电脑。
1、环境变量的概念
1.1 环境变量的含义
环境变量一般是指操作系统中指定运行环境的一些参数,即系统预定义的参数。它相当于一个指针,想要查看变量的值,需要加上“$”。
环境变量是bash shell的特性,用来存储有关shell会话和工作环境的信息。允许在内存中存储数据,以便运行在shell上的程序和脚本访问。这些数据可以是用来识别用户、系统、Shell的特性以及任何其它需要存储的数据。
1.2 环境变量的分类
1.2.1 按作用的范围分
在Linux中的变量,可以分为环境变量和本地变量:
1)环境变量:相当于全局变量,存在于所有的Shell中,具有继承性;
2)本地变量:相当于局部变量,只存在当前Shell中,本地变量包含环境变量,非环境变量不具有继承性。
1.2.2 按生存周期分
1)永久:需要修改配置文件,变量永久生效;
2)暂时:使用export定义,关闭Shell后失效。
2、环境变量的组织方式
每个程序都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以‘ ’结尾的环境字符串。Main函数的第三个参数就是环境表地址。
3、常见的环境变量
3.1 PATH
该变量指定命令的搜索路径。
【例】
释:从中可以看出,在当前目录下,PATH的值。它表示在当前目录下执行的每一条指令的搜索路径,每个目录以冒号隔开。当执行一条指令时,系统就会从系统文件中去寻找,找到了就执行;否则不执行。
3.2 HOME
该变量指定用户的主工作目录,即用户登录到Linux系统时,默认的目录。
3.2.1 普通用户下的主工作目录
【例】
3.2.2 超级用户下的主工作目录
【例】
释:环境变量是一个变量,它的值随着用户的不同而不同。
3.3 HISTSIZE
该变量指定保存历史命令的数目。
【例】
释:在Linux系统中最多保存1000条命令记录。
3.4 LOGNAME
该变量指定显示用户的登录名。
【例】
3.5 HOSTNAME
该变量指定主机名
【例】
3.6 SHELL
该变量指定用户当前使用的解析器。
【例】
4、修改和显示环境变量的命令
4.1 echo
该命令用于显示某个环境变量的值。
4.2 env
该命令指定显示所有的环境变量和值。
【例】
4.3 set
该命令指定本地变量。
【例】
4.4 export
该命令指定设置一个新的环境变量。
【例】
注意:环境变量一般用英文字母大写加下划线表示。
4.5 unset
该命令指定清除环境变量。
【例】
4.6 readonly
该命令用于设置只读环境变量。
【例】
释:将环境变量MY_ENV设置为只读模式后,就不能在对它进行修改了,直到用户退出登录后才失效。
5、存放环境变量的文件
5.1 /etc/profile
该文件的作用是当用户登录时获取系统的环境变量,只获取一次。
5.2 /etc/bashrc
当执行完/etc/profile文件后,用户想打开bash Shell就会读取该文件。如果想每次打开bash Shell后都执行某些操作,可以在该文件中设置。
5.3 ~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的shell信息。当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc文件。
单个用户此文件的修改只会影响到他以后的每一次登陆系统。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么它在每次登陆的时候都会去获取这些新的环境变量或者做某些特殊的操作,但是仅仅在登陆时
5.4 ~/.bashrc
该文件包含专用于单个人的bash shell的bash信息,当登录时以及每次打开一个新的shell时,该该文件被读取。
单个用户此文件的修改会影响到他以后的每一次登陆系统和每一次新开一个bash。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么每次它新登陆系统或者新开一个bash,都会去获取相应的特殊的环境变量和特殊操作。
5.5 ~/.bash_logout
当每次退出系统(退出bash shell)时,执行该文件。
6、通过代码获取环境变量
【例1】
注:命令行第3个参数是环境表地址,是一个字符型数组指针。
运行结果:
【例2】通过第三方变量environ获取
运行结果:
注意:libc中定义的全局变量environ指向环境变量表,因为environ没有包含在任何头文件中,所以在使用时要用extern声明。
7、通过系统调用获取或设置环境变量
通常用getenv和putenv函数来访问特定的环境变量,而不是用environ变量。但是,如果要查看整个环境,则必须使用environ指针。
【例1】
运行结果:
【例2】
运行结果:
释:“export MY_ENV=Love”导出环境变量,可以被子程序继承下去;而“MY_ENV=Love”导出的是普通变量,不具有继承性(与getenv函数一样)。