macOS 环境变量马克

macOS 环境变量马克

大家好我叫乌图米,我会在这里陆续跟大家分享一些有的没的数码体验、软件技巧、系统知识,欢迎大家留言与我交流~如果你喜欢文章的内容,可以在文末点个赞 ,你的支持就是我最大的动力 !

这篇文章记录一下 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 指令查看所有的环境变量
# 使用 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 之后