一起养成写作习惯!这是我参与「掘金日新计划 · 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飘然而去。
全剧终。