环境变量详解

在我之前的博客中已经介绍过了环境变量的一些基础知识以及操作方法,今天写这篇博客的目的是为了在之前文章的基础之上添加一些新的知识点,创作不易,希望大家多多支持!

环境变量

环境变量详解_第1张图片

认识环境变量

我们在使用Linux的时候会发现我们的操作系统很聪明,知道我们当前在哪个文件夹,也知道一些指令的地址,知道主机名叫什么,用户名叫什么,这些能力都离不开环境变量,环境变量顾名思义,就是bash shell来存储shell会话和工作环境的相关信息。

 bash中的环境变量分为全局变量和局部变量。

全局变量

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

Linux系统在你启动bash会话的时候就设置好了一些全局环境变量,系统环境变量基本上会使用全大写字母,以区别用户自定义的环境变量。

可以使用env或printenv命令来查看全局变量

环境变量详解_第2张图片

 要显示个别环境变量的值,可以使用env | grep 环境变量名,也可以使用 printenv 变量名,也可以使用echo $变量名 :

 

 局部环境变量

局部环境变量就是只能在定义它的进程中可见。这些变量叫用户自定义局部变量。

那么如何查看局部环境变量呢?其实是没有哪个命令可以只显示这类变量,set命令可以显示特定进程中的所有环境变量,包括局部变量,全局变量,用户自定义变量以及局部shell函数,还会按照字母顺序对结果进行排序。

入过想查看创建的局部变量,也可以使用echo $变量名,或者set配合管道使用

创建自己的环境变量

创建局部环境变量

 注意等号的左右时没有空格的,如果用于赋值的字符串包含空格,则必须用 单引号或双引号来界定该字符串的起止。

 创建全局环境变量

全局环境变量在设置该变量的父进程所创建的子进程中都是可见的,创建全局变量的方法是先创建局部变量,然后再将局部变量导入到全局变量。

环境变量详解_第3张图片

 export命令使创建的局部变量变成了全局变量。

这里有个小技巧,为了尽可能少敲键盘,可以将export命令直接写在创建局部变量之前:

 但是这个改变仅在子shell中有效,也就意味着如果退出你的bash进程,那么重新登录之前设置的全局环境变量就会被清除。

删除环境变量

环境变量可以创建也就可以被删除,那么删除环境变量可以用unset这个命令来完成这个操作。在使用unset命令时,不要使用$这个符号。

环境变量详解_第4张图片

 总结一下:

什么时候使用$,什么时候不使用$,这里做一个总结,如果要用到变量,就使用$;如果要操作变量,就不使用$。但是规则的例外是使用printenv显示某个变量的值。

删除也是一样,子shell删除全局变量不会影响父shell。

默认的shell环境变量

要知道,bash shell是有默认环境变量的,如果没有默认的环境变量的话,那么我们每次使用Linux使用env就看不到有任何变量,我们都知道子进程会继承父进程的环境变量,而我们执行的每一条命令其实都是shell创建了一个子进程,所以默认继承下来的这些环境变量就是默认的shell环境变量

具体的环境变量这里不做更多的展示。

设置PATH环境变量

我们在自己写一个程序编译形成可执行程序之后,为什么运行这个程序需要带./,而像ls,echo这些指令就不需要./,这是因为你输入一个命令之后,shell会去搜索系统,从中找到对应的程序,PATH环境变量定义了用于朝朝命令和程序的目录。

PATH中的目录之间以冒号分隔。shell会在其中查找命令和程序。

 那么如何将设置PATH环境变量呢?

环境变量详解_第5张图片

但是这中对于PATH变量的修改只能持续到退出或重启系统,这种效果不能一直起效。

定位系统环境变量

当你登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令,这些文件叫启动文件或环境文件。bash进程的启动文件取决于你启动bash shell的方式。启动bash shell有下面三种方式:

  • 登录时作为默认登录shell
  • 作为交互式shell,通过生成子shell启动
  • 作为运行脚本的非交互式shell

登录shell

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

环境变量详解_第6张图片

./etc/profile文件是系统中默认的bash shell的主启动文件。系统中的每个用户登录都会执行这个启动文件。

接下俩我们仔细看一看每个文件:

1../etc/profile

./etc/profile这些系统层面的文件夹,基本都包含了系统的环境变量,具体的文件中的内容这里不做具体解释,不同的发行版本的文件内容也是不相同的。

要留意的是有些Linux发行版使用了可拆卸式认证模块,在这种情况下,PAM文件会在bash shell 启动之前被处理,前者可能会包含环境变量。PAM文件包括/etc/environment文件和$HOME/.pam_environment文件

2.$HOME目录下的启动文件

上面的四个启动文件都用于一个目的:提供用户专属的启动文件来定义该用户所用到的环境变量,大多Linux发行版只用这4个启动文件中的一两个。

上面的图片可以发现,这四个文件都是以.开头,所以这些文件都是隐藏文件,它位于$HOME目录下,每个用户可以对其编辑并添加自己的环境变量,其中的环境变量,其中的环境变量在每次启动bash shell时生效。

登录shell这一块的内容我不做详细介绍,理解起来也比较困难,大家简单做了解即可。

环境变量持久化

通过上面的介绍,我们就可以知道另外一种创建自己的永久性全局变量或局部变量。对全局环境变量来说,我们可以将修改过的或全新的环境变量放在/etc/profile中,但这样的话也会有一个问题:如果发行版本更新就会导致文件也随之更新,这样一来,所有定制过的变量设置就都没有了。

最好在/etc/profile.d目录中创建一个以.sh结尾的文件,把所有新的或修改过的全局环境变量设置都放在这个文件中。

数组变量

环境变量里面还有一个很酷的东西给大家介绍一下,环境变量是可以作为数组使用的,数组可以存储多个值的变量,这些值既可以单独使用,也可以作为整体使用。

要为某个环境变量设置多个值,可以把值放在圆括号中,值与值之间以空格分隔:

如果按照常规的查看环境变量的指令结果是这样的:

 

 那么想要查看某个的环境变量要怎么做呢?

 要查看所有的环境变量要用到通配符“ * ”

当然想要修改也是可以的,可以修改数组中的某个变量

 

也是可以使用unset来进行删除的

环境变量详解_第7张图片

但是会发现数组中的内容不会移动,也就是被删除的地方就是空的。 也可以unset后直接跟数组名,就可以将数组变量完全删除。

数组变量平时很少见,所以这里的内容大家了解即可,自己去试一试,还是蛮有意思的。

内容就到这里啦,创作不易,还希望大家多多支持!!!

你可能感兴趣的:(linux,bash)