大家好我叫乌图米,我会在这里陆续跟大家分享一些有的没的数码体验、软件技巧、系统知识,欢迎大家留言与我交流~如果你喜欢文章的内容,可以在文末点个赞 ,你的支持就是我最大的动力 !
这篇文章记录一下 macOS 环境变量的相关内容。啥是环境变量,它从哪儿加载,如何查看和设置环境变量,我们需要注意哪些环境变量?一起来看看。
0 啥是环境变量
操作系统中的环境变量「environment variables」一般是用来指定操作系统运行环境的一些参数。
函数执行时通过传递的参数调节其行为;同样,也可以设置环境变量来调节操作系统系统运行时的行为。
我们知道操作系统的代码相对固定,在获取下个版本更新前,系统的行为将按照当前的代码执行。如果大家的系统都一样,如何来区分其中和用户本身相关的不同配置呢?这时候就可以用到环境变量。
最简单的例子:需要用到你用户名的地方,操作系统使用例如NAME
的变量来储存;在一些关键函数执行时,可以直接调用NAME
而不是你具体的用户名;不同的用户NAME
值不同,但都可以调用相同的操作系统函数。
操作系统以及任何基于操作系统的程序,都可以使用到系统级别或用户级别的环境变量。VS Code 可以调用,终端 Shell 可以调用,Homebrew 也可以调用。当然,对用户来讲,比较常见的情况是在终端配置它们。这也是环境变量最根本调用方式,使用 Shell 调用。
1 环境变量的储存与加载
笔者对于环境变量一开的印象,就是跟着教程在 cmd 里面复制粘贴一些代码,似乎就设置好了。或者是 Windows 上,打开一系列的设置路径,来到一个增添列表项的地方,开始手动添加。这些环境变量似乎来无影去无踪,仅仅是存在于系统的几行代码。
但实际上,这些变量都有相应的文件储存着,且这样的文件不止一份。区别于用户级还是系统级,它们分散在不同的文件夹下。Shell 会按照固定的优先级来加载这些文件,完成环境变量的加载。
目前,macOS 10.15 Catalina 已经将默认的终端 Shell 配置为了zsh
。这是非常明智的举动,zsh
相比之前的bash
有诸多更新的特性、人性化的配置。笔者就以zsh
为例,说说终端的储存与加载。
zsh
有这样一个列表「打钩表示对应的会话开始时会调用这个配置」。
有很多文件,一一道来。
首先这些配置文件是根据是否系统级别来区分的。/etc/
下的文件将被所有用户调用「如果需要的话」;.z*
的文件仅适用于当前用户。
当前用户的配置文件储存在ZDOTDIR
中。默认情况下,这是用户的根目录,例如笔者的/Users/tommy
。当然,也可以将ZDOTDIR
设置为另一个目录.
在所有系统级与用户级的配置文件中,zsh
首先调用/etc/zshenv
,然后调用用户的.zshenv
。这是同级别下优先级最高的配置文件,其中的配置会影响所有情况下的zsh
。
接着,登录 Shell 将调用/etc/zprofile
和.zprofile
。然后,交互式 Shell 将调用/etc/zshrc
和.zshrc
。然后,再次登录 Shell 再次调用 /etc/zlogin
和.zlogin
。为什么有两个用于登录 Shell 的文件?zprofile
相当于bash
和sh
的模拟登录文件,zlogin
相当于ksh
的模式登录文件。
最后,登录 Shell 退出时会对调用zlogout
用于清理工作。注意,总是用户文件优先于系统文件。如果 Shell 由外部进程终止,则可能不会运行这些文件。
这些内容比较难以理解,可以参考更全面的分析,这是笔者翻译的国外「Moving to zsh」系列的第二篇,详细讲解了zsh
的配置文件:
简单理解:了解一下上面的表格就够了,这是在说明环境变量可能出现的储存位置与加载顺序。一般来说,我们使用终端更改环境变量时,对应的修改将储存在.zshrc
中。
2 查看与配置
说了一堆看不懂的,来说说能操作的。打开我的小终端,切换我的输入法。
啥时候来做一篇笔者爱用的「双拼」输入法的介绍。
- 使用
env
和echo
指令来查看环境变量:
# 如果你不了解这些指令,可以查看它们的 manual
man env
man echo
# 使用 env 指令查看所有的环境变量
env
# 使用 echo 指令查看某个环境变量
echo $[variable]
echo $PATH
- 使用
export
指令来添加或更新环境变量:
# 同样可以查看 manual
man export
# 添加环境变量,仅仅是临时添加,对当前终端会话生效
export [KEY]=[VALUE] # 一般模式
export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:...:<PATH N> # 针对 PATH 变量
# 将变量储存在配置文件中,此后长期有效
echo 'export [KEY]=[VALUE]' >> ~/.zshrc # 推荐使用 .zshrc
source ~/.zshrc # 刷新使用的环境变量
- 移除添加的环境变量:
unset [KEY]
当然,如果知道自己使用的配置文件具体是哪一个,可以直接用编辑器打开,直接在里面添加内容。储存之后,依然是长期有效的。
注意,查看环境变量的时候,一定要加上前面的$
符号。这是终端的保留字符,一般用于获取变量的内容「字符串或数字等」,还有很多特殊的用法。例如:
$USER # 获取用户名环境变量
$(brew --cache) # 获取这条指令的输出
$0 # 脚本名称
$$ # 进程 ID
$# # 参数个数
$? # 脚本返回值
$n # 第 n 个参数
${10} # 10个以上参数加上大括号
$@ # 所有参数
...
3 用到的环境变量
比较常用的环境变量是PATH
。这个变量储存了大量的路径,可能来自各个软件包。一般来说,其中储存的路径是对应软件包的可执行文件。
例如,node@12
将其二进制执行文件的路径/usr/local/opt/node@12/bin/node
储存在了.zshrc
中。这样,在终端中使用node
指令时,就可以自动从PATH
中搜索,加载到这里的可执行文件。
可以使用echo $PATH
查看其内容,使用export
指令更新其中的内容。
echo $PATH # 查看 PATH 变量
export PATH=$PATH:<PATH 1>:<PATH 2>... # 添加内容到 PTAH 之后
export PATH=<PATH 1>:<PATH 2>:...:$PATH: # 添加内容到 PTAH 之前
另外还有一些 Homebrew 相关的环境变量可以设置。可以使用brew config
查看 Homebrew 的配置。
brew config # 查看配置
安装完 Homebrew 之后,打开.zshrc
文件,可以看见其中配置了一些相关内容:export PATH="/usr/local/sbin:$PATH"
。这是将 Homebrew 的可执行文件引入PATH
变量,从而可以在终端中使用它。
除此外,还有另外三个可以添加的变量。
# homebrew
export PATH="/usr/local/sbin:$PATH"
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles # 替换二进制文件源
export HOMEBREW_EDITOR="/usr/local/bin/code" # 设置 Homebrew 默认的编辑器
export HOMEBREW_NO_AUTO_UPDATE=true # 设置执行 brew 指令时,不更新 Homebrew
4 默认的指令来源
当你查看PATH
变量时,或许会发现,其中的文件路径并不是很多。我们知道,node@12
将自己的可执行了文件放在了PATH
中,因此可以被终端执行,那诸如python
、git
之类的指令是怎么被识别的呢?
那是因为除开PATH
中的路径,操作系统还会从许多默认的路径去加载程序包的可执行文件。例如/usr/bin
、/usr/local/bin
等等。
你可以使用which
指令查看某个可执行指令的来源;使用where
查所有匹配的指令来源。
which [command] # 查看指令来源
where [command] # 查看所有匹配的指令
5 注意事项
有一些注意事项,罗列一下:
echo
指令输出某个环境变量为空时,表示没有设置该变量。- 尽量不要更改默认的环境变量,避免引起错误。
- 推荐使用更新的
zsh
;对应的配置文件使用.zshrc
。 - 如果使用的
bash
,对应的配置文件是.bash_profile
。