Linux环境变量详解

846 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

环境变量是给谁用的

这个问题问得好。

相信很多人都配过环境变量。

如果你是开发java的,一定在开始的时候配置过JAVA_HOME啥的。

如果你是早期开发Golang的,一定在入门的时候配置过GOPATH

等等等等。。。。。。

如果你安装过一些开发软件,例如Android Studio,Nodejs环境啥的,可能还配置过PATH

或者安装VSCode,在下一步下一步的时候,是不是有一步,说将code程序放到PATH中。

等等等等。。。。。。

那么配置了这些东西,到底什么东西什么时候用上了这些环境变量呢?

每一个环境变量又起了什么样的作用?

一个精简的回答:

任何启动中的程序,也就是进程,都有自己可用的一份环境变量列表。

环境变量的格式

不管是Windows下,还是Linux下,macOS也同样。

环境变量都是以键值对的形式进行存取的。

例如:

JAVA_HOME -> /c/javahome/
GOPATH -> /c/gopath

不管长成什么样,在存取的时候,都看成字符串,一个例子就是:

PATH -> /usr/bin:/usr/local/bin:/lib/bin

后面整体看做一个字符串,有:分割也不能改变这个事实。

什么时候用到环境变量

环境变量就是一堆键值对。那么什么时候用到这些键值对呢?

好,如果你开发过服务端程序,比如说一个小用户后台

现在的需求就是,需要整两个环境,一个是正式环境,一个是测试环境。

不同的环境连接不同的数据库。

上面是一个很常见的需求对吧。

那么我们就要启动两个后台进程

称之为:

  • 后台-debug
  • 后台-prod

问题就是,这两个进程实际上代码是一样的。如何让这两个进程知道自己是debug还是prod呢?

有的小伙伴说了:“用配置文件”。

进程启动的时候,读取的配置文件不一样不就行了。

对,这个方式是可以的。

但,实际上,通过环境变量的方式有时更简单。

举个例子,比如说,你的程序是 user-back

启动的时候(Linux下,bash环境):


MODE=debug ./user-back # debug 环境
MODE=prod ./user-back  # prod 环境

没看错,就是这么简单,就是在启动的时候,在命令前面加xxx=yyy,这样即可。

此时此刻,启动之后,这量个进程的环境变量就会分别多一个键值对:

MODE --> debug # 第一个进程 
MODE --> prod  # 第二个进程

user-back进程中,完全可以读取到这个信息。

如何读取呢?

这个得看你使用的开发语言给出的具体的api是什么,很容易查到的,这里不多言。

系统内置环境变量自定义环境变量

上面的讲解中,我们其实自定义了一个环境变量:MODE

注意,这个MODE只会存在于user-back这个进程中,不会对其他的进程造成污染。

所以请放心使用。

但是,如果你的操作系统本身就有一个MODE变量,那么自定义的这个,就会覆盖系统给你的,当然,这个覆盖作用,也只存在于user-back这个进程中。(这种说法不准确,因为一个进程有可能启动另一个进程,这个启动过程,很可能会将父进程的一些变量直接给到子进程)

好了,既然我们已经学会了使用MODE这种自定义变量了,那么系统内置的变量也来一个尝尝鲜:

我们来说一说PATH变量这个老朋友。

PATH 变量

别担心,PATH并不特殊,也只是一个普通的环境变量。

不过,PATH如果配不好,很多程序都启动不了。

为啥?

因为PATH掌管着该去哪里找程序这个很至关重要的信息。

给一个例子,在Linux下打印一下PATH变量的内容:

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

可以看出,内容是一个用冒号:分割的字符串。每一个部分都是一个目录

谁用到了这个变量呢?

答案就是每一次你敲击指令的时候,都用到了。

例如:

# ls
bin   dev  home  lib64       media  opt   root  sbin  sys  usr

小伙伴可能疑惑了:“我没用到PATH的内容啊”。

PATH反问道:“那么请你告诉我,ls 这个程序在哪里,凭什么你就能执行?”

小伙伴:“这,这,这,这是系统帮我找的”

PATH笑道:“笑了,系统凭什么帮你找,难道他还能遍历每一个目录,来找一个 ls 的程序?”

小伙伴:“哎,对,系统就是遍历每一个目录,然后去找一个 ls 的程序,然后执行”

PATH摇了摇头:“将你那消化不良的气体,从你的体内排出!!!”

小伙伴:“啥意思”

PATH:“放屁”

小伙伴:“。。。。。。”

PATH:“如果系统,遍历每一个目录的话,那么你执行任何一个指令的时候,都会卡到死,你信不”

小伙伴:“倒也是”

小伙伴,突然悟了:“PATH,是你,我明白了,其实就是遍历将你分割的每一个目录!!!

PATH飘然而去。

全剧终。