嵌入式 Linux 入门(七、Linux 下的环境变量)
嵌入式 Linux 入门第七课,学习理解 linux 的环境变量 ......矜辰所致
前言
学习完 Linux 的 Shell 命令 和 Shell 脚本,我们还需要理解一个东西 :环境变量,理解了 Linux 的环境变量,前面的文章中有些细节的东西,在本文可以得到说明和体现。
嵌入式 Linux 入门系列博文:
嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)
嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)
嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)
嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )
嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)
嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)
.
我是矜辰所致,一名摸爬滚打于物联网行业十多年的嵌入式工程师,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!
一、什么是环境变量
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息,操作系统工作环境的一些设置选项或属性参数。
环境变量相当于给系统或用户应用程序设置的一些参数。
作为嵌入式开发人员,多少都会接触过环境变量,在我们常用的 windows 系统中,设置环境变量的方法如下:
即便知道 windows 下的环境变量设置方法,也有大多数朋友并不知道环境变量的真正含义,很多时候我们只是根据某个教程按照步骤设置而已,并没有深入的去思考。
比如上图中的 Path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。
在上面的 Path 中有一个 gcc 相关的环境变量,在 windows 系统中是不自带 gcc 编译器的,所以我们需要使用 gcc 编辑器需要把其添加到环境变量,才可以使用 gcc 程序对应的一系列命令:
还是因为 windows 下大多是图形化界面操作,而且很多 IDE 会在安装的时候自动帮我们配置好环境变量,所以对于环境变量的理解要求呀不需要那么多。但是现在我们学习 Linux ,所有的东西都是文件,都是使用 Shell 命令执行,所以学习认识 Linux 下的环境变量,能让我们更好的理解环境变量,也是我们学习 Linux 必须要了解的知识点。
二、Linux 环境变量简介
在我们的上一篇文章,说明 Shell 脚本编程变量的时候提到过环境变量:
Linux 下的环境变量是 Shell 变量的一种,Linux 环境变量也可称之为 Shell 环境量变。
为什么呢 ?简单理解一下,在 Linux 中,因为所有程序操作都可以使用 Shell 命令完成,而环境变量就是给系统或应用程序设置的一些参数。
按照上图的说法,我们在 Shell 脚本中,临时使用=
定义的变量就做局部变量,比如 a=123
,这个a
就是局部变量,而环境变量呢?是在 shell 启动的时候就已经定义好了的,这个我们在下面会有说明。
2.1 环境变量分类
按变量的 生存周期 来划分:
- 永久环境变量:在环境变量脚本文件中配置,变量永久生效,用户每次登录时会自动执行这些脚本。
- 临时环境变量:在 Shell 中临时定义的,使用
export
命令声明,变量在关闭 shell 时失效。
按变量的 生效范围 来划分:
- 系统环境变量:公共的,对全部的用户都生效。
- 用户环境变量:用户私有的,只对该用户生效。
上面说明的划分方式,以及说明,我都会在下文示例得到体现。
2.2 查看环境变量
env 命令
env
命令: 查看 当前用户 全部的环境变量。
上图是 env
命令结果的结尾部分,其中上面还有很多。
额外提一下,有没有发现上面的环境变量的名字都是大写,环境变量的赋值语句就是我们学过的 Shell 脚本编程的变量定义语句,使用变量名=
赋值。
export 命令
export
命令: 用来显示和设置环境变量 ,不加参数直接输入会显示当前 导出成用户变量 的 shell 变量。
这里就有一个问题说明,如何理解这个 导出成用户变量 的 shell变量 ?
每个 shell 有自己特有的变量,这个和用户变量是不同的,当前用户变量和你用什么 shell 无关,不管你用什么shell都在,比如 HOME,SHELL 等这些变量,可以理解为上面所说的环境变量。
shell 自己的变量可以理解为 shell 的局部变量,在脚本或者命名中定义,换一个 shell 就不一样了。
一个 shell 自己的变量可以通过export
“导出”变成一个用户变量,我们来看一下一个示例说明:
在上图中,我们直接在当前 Shell 中新建了一个变量,然后只要这个 Shell 不关,这个变量就一直可以调用,没想到这也可以把? 就是这么神奇!
上图中说到了 Shell 子进程的内容,这里我们复习一个知识点,在文章 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本) 中的 “2.2 Shell 脚本的启动方式” 我们提到过 Shell 的 3 种启动方式,文中提到过 3 种启动方式,其中有 2 种方式运行脚本会开启子进程:
具体的理解我们来看一个示例:
echo 命令
echo
命令我们在以前文章就介绍过,可以把终端的变量内容打印出来。
使用命令查看变量一下子看太多了,我们一般都是根据自己的需要查看对应的环境变量,比如在文章 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本) 中的 “1.3 Shell 命令的本质” 小结我们查看了一个 PATH 的环境变量:
这个 PATH 环境变量意思是:可执行程序的搜索目录,可执行程序包括 Linux 系统命令和用户的应用程序。
当然,我们还可以查看很多其他的环境变量,比如:
如上图所说,我们使用 echo
打印出的环境变量,其实就是 Shell 脚本编程的基础语法,只使用一个命令 echo
把变量打印出来而已,并不是有些人所认为的Linux 下怎么这么复杂,打印都这么多“命令”。
一些常用的环境变量:
PATH :可执行程序的搜索目录,决定了shell 将到哪些目录中寻找命令或程序
HOME :当前用户主目录
USER :当前登录用户的用户名
HISTSIZE :保存历史命令的数目
LOGNAME :当前用户的登录名
HOSTNAME :指主机的名称
SHELL :当前用户 Shell 解析器
LANG :Linux系统的语言、地区、字符集
LANGUGE :语言相关的环境变量,多语言可以修改此环境变量
2.3 做个简单小结
我结合了太多的地方说明,然后加上自己的理解总结,不同的教程对变量的准确定义还不完全一样,最终还是发现上面的一些变量的说明有点绕,如果有觉得不妥的地方请大佬们指出  ̄□ ̄|| 。
其实上面概念有点区分不清楚也问题不大,记住一点,环境变量也是个变量,不同的变量关键在于,使用不同的 Shell 或者 不同的用户,能不能够使用这些变量,这是我们在以后需要注意的问题。
我们在下文会介绍,如何设置环境变量,使得其对所有用户有效,或者只对某个用户有效。
我们下面会讲一下如何设置环境变量的一些方法。
三、设置环境变量
在上面我们介绍 export
命令的时候,我们使用 export
命令把 Shell 变量变成了用户变量,使得在同一个终端中的所有 shell 都可以打印变量,但是,我们如果重新打开一个终端,变量又变成了无法识别:
我们使用 export
命令定义的变量只对当前 shell 有效果,上面我们打开一个新的终端, 变量就无法识别了,如果关闭终端,重新打开,变量也会消失,这种变量是临时的,那么如果想要一个变量,新开的终端或者重新启动 Shell 都能识别,有什么办法吗?
当然有,那就是修改 Shell 配置文件,把变量设置成永久的环境变量。
所以再次说明一下,上面环境变量的理论如果有点稀里糊涂问题也不大,等以后熟悉了自然会越来越理解,前面的铺垫只是为了引出本文的重点:
<3
本文的重点 ☆ 如何设置 对所有用户永久生效的 和 对单用户永久生效 的变量 ☆ 。
<3
3.1 Linux 环境变量文件
在 Linux 中,与环境变量有关的文件如下:
- 全局配置
- /etc/profile
全局配置,所有用户登录时都会读取该文件。
登录用户以后重新打开终端吗,这个/etc/profile
不会再执行。意思就是登录以后临时在这个文件里面添加的变量,需要重启重启生效或者手动执行source /etc/profile
。 - /ect/bashrc
全局配置,所有用户登录时都会读取该文件,该文件配置的环境变量将会影响全部用户使用的bash shell ,不管是何种方式执行 bash ,都会读取此文件。
Ubuntu没有此文件,与之对应的是/ect/bash.bashrc
登录用户以后重新打开终端吗,这个/ect/bash.bashrc
还会执行。开一次终端就执行一次,意思就是登录以后临时在这个文件里面添加的变量,重新打开终端就能立即生效。 - /etc/profile.d目录
/etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。 - 用户配置
- ~/.profile
当前用户登录的时候执行,若 bash 是以 login 方式执行时,读取~/.bash_profile
,若它不存在,则读取~/.bash_login
,若前两者不存在,读取~/.profile
。
另外,图形模式登录时,此文件将被读取,即使存在~/.bash_profile
和~/.bash_login
。
登录用户以后重新打开终端吗,这个~/.profile
不会再执行,同上面/etc/profile
类似理解。 - ~/.bash_login
若 bash 是以 login 方式执行时,读取~/.bash_profile
,若它不存在,则读取~/.bash_login
,若前两者不存在,读取~/.profile
。 - ~/.bash_profile
当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。
只有 bash 是以 login 形式执行时,才会读取此文件。通常该配置文件还会配置成去读取~/.bashrc
。
Ubuntu 没有此文件。 - ~/.bashrc
当用户登录时以及每次打开新的Shell时该文件都将被读取。
当 bash 是以 non-login 形式执行时,读取此文件。若是以 login 形式执行,则不会读取此文件。
登录用户以后重新打开终端吗,这个~/.bashrc
还会执行。开一次终端就执行一次,同上面/ect/bashrc
类似理解。 - ~/.bash_logout
当每次退出系统(退出bash shell)时执行该文件。
注销时,且是 longin 形式,此文件才会读取。也就是说,在文本模式注销时,此文件会被读取,图形模式注销时,此文件不会被读取。
/etc/profile
在我们使用的 Ubuntu 系统中,我们找到 /etc/profile
文件来看看:
~/.profile
同样的,查看一下用户目录下的~/.profile
文件:
shell 执行顺序
根据不同的登录模式,Shell 的执行顺序也有一定的区别,一般情况如下:
(1) 图形模式登录:/etc/profile
—>~/.profile
(2) 图形模式登录后,打开终端时,读取顺序:/etc/bash.bashrc
—>~/.bashrc
(3) 文本模式登录时:/etc/bash.bashrc
—>/etc/profile
—>~/.bash_profile
凡是读取到~/.bash_profile
的,若该文件不存在,则读取~/.bash_login
,若前两者不存在,读取~/.profile
<3 结合我们上面的文件程序,我们可以得出来,在我使用的虚拟机 Ubuntu 上的 Shell 脚本执行顺序为:
/etc/profile
—>/etc/bashrc
—>/etc/profile.d
—>~/.profile
—>~/.bashrc
3.2 ☆添加环境变量☆
前面我们讲过了使用 export
命令可以临时的添加一个环境变量,但是也只能在当前终端的 Shell 下面有效果,我们现在来说明一下,添加全部用户,永久有效的环境变量。
3.2.1 全部用户
通过上文我们提到的环境变量配置文件,我们要添加 针对全部用户有效果的 环境变量,可以从全局配置的文件入手:
这里我感觉上面的图我已经讲得很详细了,这里举个简单例子说明,我们使用上图说的第二种方式:
上面我们通过 /ect/bash.bashrc
文件定义了一个新的变量 testvar
,我们重新打开终端,就可以使用这个变量,如下图:
通过上面方式添加的环境变量,是针对所有用户,所有进程都共享的 永久的 环境变量。
<3 至于具体使用过程中,使用哪种方式定义全部用户的环境变量,根据自己的需求,但是总的来说,在/etc/profile.d
目录下面添加脚本是 Linux 比较推荐的一种方式,也就是上面我说的第三种方式,因为便于管理,而且可以区分不同的类型,不同的应用的环境变量。
3.2.2 单个用户
有了上面的说明,对单个用户永久生效的 环境变量就好理解了,针对我们使用的 Ubuntu 系统,有2种方式添加永久生效的单个用户环境变量。
这个的测试简单就不上图了,直接修改文件,然后重新打开新的 Shell 终端,可以使用变量,但是切换到另外一个用户,就无法打印。
结语
通过本文的学习,我们对 Linux 下的环境变量有了一个全面的认识,而且通过对环境变量的学习,对我们理解 Shell 的运行有了更深一层的认识。
在我使用的虚拟机 Ubuntu 上的 Shell 脚本执行顺序为:
/etc/profile
—>/etc/bashrc
—>/etc/profile.d
—>~/.profile
—>~/.bashrc
本文的重点在于学会添加设置 对所有用户永久生效的 和 对单用户永久生效 的环境变量。
内容不算多,但是也需要好好理解,希望看完大家都能有所收获!ヾ(◍°∇°◍)ノ゙ !
本文就到这里,谢谢大家!
- 点赞
- 收藏
- 关注作者
评论(0)