嵌入式 Linux 入门(七、Linux 下的环境变量)

举报
矜辰所致 发表于 2022/09/28 19:46:26 2022/09/28
【摘要】 嵌入式 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

本文的重点在于学会添加设置 对所有用户永久生效的 和 对单用户永久生效 的环境变量。

内容不算多,但是也需要好好理解,希望看完大家都能有所收获!ヾ(◍°∇°◍)ノ゙ !

本文就到这里,谢谢大家!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。