你真的知道如何设置环境变量?

开发 后端
实际上,在 Linux 和 macOS 中,定义环境变量有三种方式,他们的效果和作用范围是不相同的。

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

[[385341]]

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

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

全局环境变量

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

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

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

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

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

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

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

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

  1. WHO_AM_I=kingname python3 test.py 

运行效果如下图所示:

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

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

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

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

 

责任编辑:赵宁宁 来源: 未闻Code
相关推荐

2009-07-07 12:48:29

JDK环境变量设置

2019-09-09 09:02:04

Linux脚本语言文本编辑器

2011-05-31 13:41:50

Android 环境变量

2009-07-07 13:44:35

JDK环境变量设置

2009-10-21 12:58:18

2009-06-15 16:28:30

JAVA环境变量

2020-08-05 09:48:20

Docker容器工具

2009-07-03 16:13:10

JSP环境变量

2010-04-27 18:30:42

AIX系统

2021-02-19 07:59:21

数据埋点数据分析大数据

2020-08-17 07:38:47

Linux系统

2010-03-26 12:50:02

CentOS系统

2010-01-11 17:39:31

Fedora 8配置J

2010-01-12 15:46:54

Fedora JDK

2010-09-16 15:44:12

Java环境变量

2011-06-14 09:21:55

Linux Qt 环境变量

2015-11-19 15:01:11

JAVA_HOMELinux

2021-11-18 15:54:17

FreeDOSLinux

2009-12-25 09:44:59

redhatPATH设置环境变量

2010-02-22 15:04:53

Ubuntu 7.04
点赞
收藏

51CTO技术栈公众号