6

一日一技:你真的知道如何设置环境变量?

 3 years ago
source link: https://www.kingname.info/2021/05/14/do-you-know-env/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一日一技:你真的知道如何设置环境变量?

发表于

2021-05-14

| 分类于 Linux

| 评论数: 0

很多人都知道环境变量,很多人也在使用环境变量。但是很多人一说到在 Linux、macOS 中使用环境变量,第一个想到的就是export XXX=yyy这种形式的环境变量。但实际上,在 Linux 和 macOS 中,定义环境变量有三种方式,他们的效果和作用范围是不相同的。

以 macOS 为例,来说明这三种环境变量有什么不同。我们通过下面这个 Python 程序来验证设置结果:

import os

name = os.getenv('WHO_AM_I', '找不到环境变量')
print('环境变量 WHO_AM_I 的值是:', name)

全局环境变量

如果你使用 ZSH,那么你就会知道,ZSH 有一个配置文件~/.zshrc,打开以后,它的内容如下:

2021-03-04-20-19-58.png

在这里添加一行代码:export WHO_AM_I=kingname,就能设置一个全局的环境变量。这个环境变量会始终生效。即使你现在把电脑关了再打开,或者任意新开一个终端窗口,这个环境变量始终是有效的。如下图所示:

2021-03-04-20-23-27.png

如果你电脑上没有 ZSH 的话,你也可以修改系统默认的~/.bashrc文件

仅对当前窗口有效的环境变量

除了修改配置文件外,你也可以直接执行命令来设置环境变量,这也是最众所周知的方式。我们先把~/.zshrc里面的环境变量删了,来测试一下:

2021-03-04-20-27-26.png

可以看到,当我们执行export WHO_AM_I=kingname时,这个环境变量只对当前终端窗口有用。你重新开一个新的终端窗口,或者关闭当前窗口再打开,它都会失效。

仅对当前命令有效的环境变量

除此之外,我们还可以设置让环境变量只对当前命令有效,就是把定义环境变量的代码直接放在执行的命令之前。并且不加 export。例如,我们要执行命令python3 test.py,那么我们就这样:

WHO_AM_I=kingname python3 test.py

运行效果如下图所示:

2021-03-04-20-30-36.png

可以看到,只有在命令前面带上了定义语句的这一行才能正确获得环境变量。

这种方式特别在使用 Crontab 的时候有用。如果你经常使用 Crontab,那么你一定知道,Crontab 里面是不会认你的全局环境变量的。无论你是在.zshrc文件还是.bashrc中定义的环境变量,当你通过 Crontab 来执行的时候,程序都读不到环境变量。这个时候,就可以通过这种方式让程序运行的时候现场定义环境变量:

0 12 * * * cd /job/xxx && WHO_AM_I=kingname python3 ./test.py

这样一来,程序始终能够正确获得环境变量。

谢乾坤 | Kingname wechat
第一时间获取最新文章更新,请订阅我的微信公众号:未闻Code

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK