写点什么

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

作者:矜辰所致
  • 2022-10-28
    江苏
  • 本文字数:4265 字

    阅读完需:约 14 分钟

嵌入式 Linux 入门(七、Linux 下的环境变量)
嵌入式 Linux 入门第七课,学习理解 linux 的环境变量  ......矜辰所致
复制代码

前言

学习完 Linux 的 Shell 命令 和 Shell 脚本,我们还需要理解一个东西 :环境变量,理解了 Linux 的环境变量,前面的文章中有些细节的东西,在本文可以得到说明和体现。


嵌入式 Linux 入门系列博文:

嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)

https://xie.infoq.cn/article/1adbc03be480d8203f8b1ed4a

嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)

https://xie.infoq.cn/article/4d2e926fda47f2eff019ae0e4

嵌入式 Linux 入门(三、Linux Shell 及常用命令说明)

https://xie.infoq.cn/article/b25c452df449abc1806ba446a

嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )

https://xie.infoq.cn/article/d87223a72889208660ecbec17

嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

https://xie.infoq.cn/article/16e4569fa32dce00a39eaddaf

嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)

https://xie.infoq.cn/article/1e982eb296024089baf5c1ca0

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!


一、什么是环境变量

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息,操作系统工作环境的一些设置选项或属性参数。


环境变量相当于给系统或用户应用程序设置的一些参数。


作为嵌入式开发人员,多少都会接触过环境变量,在我们常用的 windows 系统中,设置环境变量的方法如下:



即便知道 windows 下的环境变量设置方法,也有大多数朋友并不知道环境变量的真正含义,很多时候我们只是根据某个教程按照步骤设置而已,并没有深入的去思考。


比如上图中的 Path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 path 中指定的路径去找。


在上面的 Path 中有一个 gcc 相关的环境变量,在 windows 系统中是不自带 gcc 编译器的,所以我们需要使用 gcc 编辑器需要把其添加到环境变量,<font color=#0033FF>才可以使用 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 命令: 查看 <font color=#FF0033>当前用户</font> 全部的环境变量。



上图是 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.1 Linux 环境变量文件

在 Linux 中,与环境变量有关的文件如下:




/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


结合我们上面的文件程序,我们可以得出来,在我使用的虚拟机 Ubuntu 上的 Shell 脚本执行顺序为:


/etc/profile—>/etc/bashrc—>/etc/profile.d—>~/.profile—>~/.bashrc

3.2 ☆添加环境变量☆


前面我们讲过了使用 export 命令可以临时的添加一个环境变量,但是也只能在当前终端的 Shell 下面有效果,我们现在来说明一下,添加全部用户,永久有效的环境变量。

3.2.1 全部用户

通过上文我们提到的环境变量配置文件,我们要添加 针对全部用户有效果的 环境变量,可以从全局配置的文件入手:



这里我感觉上面的图我已经讲得很详细了,这里举个简单例子说明,我们使用上图说的第二种方式:



上面我们通过 /ect/bash.bashrc 文件定义了一个新的变量 testvar,我们重新打开终端,就可以使用这个变量,如下图:



通过上面方式添加的环境变量,是针对所有用户,所有进程都共享的 永久的 环境变量


至于具体使用过程中,使用哪种方式定义全部用户的环境变量,根据自己的需求,但是总的来说,在/etc/profile.d目录下面添加脚本是 Linux 比较推荐的一种方式,也就是上面我说的第三种方式,因为便于管理,而且可以区分不同的类型,不同的应用的环境变量。

3.2.2 单个用户

有了上面的说明,对单个用户永久生效的 环境变量就好理解了,针对我们使用的 Ubuntu 系统,有 2 种方式添加永久生效的单个用户环境变量。



这个的测试简单就不上图了,直接修改文件,然后重新打开新的 Shell 终端,可以使用变量,但是切换到另外一个用户,就无法打印。

结语

通过本文的学习,我们对 Linux 下的环境变量有了一个全面的认识,而且通过对环境变量的学习,对我们理解 Shell 的运行有了更深一层的认识。


在我使用的虚拟机 Ubuntu 上的 Shell 脚本执行顺序为:


/etc/profile—>/etc/bashrc—>/etc/profile.d—>~/.profile—>~/.bashrc


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


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


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

发布于: 刚刚阅读数: 8
用户头像

矜辰所致

关注

CSDN、知乎、微信公众号: 矜辰所致 2022-08-02 加入

不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 为了活下去的嵌入式工程师,画画板子,敲敲代码,玩玩RTOS,搞搞Linux ...

评论

发布
暂无评论
嵌入式 Linux 入门(七、Linux 下的环境变量)_Linux_矜辰所致_InfoQ写作社区