跳转到内容

环境变量与 PATH

环境变量是操作系统层面维护的一组键值对,会被当前进程以及它启动的所有子进程继承。Shell 本身、Shell 里运行的每一个命令,都能读取这些变量来获取配置信息,这也是许多命令行工具的行为可以通过环境变量调整的原因。

Terminal window
echo $HOME # 查看单个环境变量的值
env # 列出当前会话的全部环境变量
export MY_VAR="value" # 设置一个环境变量,并让子进程也能继承到
MY_VAR="value" # 不加 export,只在当前 Shell 内有效,子进程读不到
unset MY_VAR # 删除一个已设置的环境变量

export 是这里的关键字:不加 export 的赋值只是一个普通的 Shell 变量,作用范围局限在当前 Shell 进程内部;加上 export 之后,这个变量才会被写入环境变量表,之后由这个 Shell 启动的任何子进程(例如执行的脚本、调用的程序)都能读取到它。

PATH 是最常被直接接触到的环境变量之一,它的值是一串用冒号分隔的目录路径列表:

/sbin
echo $PATH

在 Shell 基础一节提到过,输入一个命令后,如果它不是内置命令,Shell 会按 PATH 列出的目录顺序依次查找同名的可执行文件,找到第一个匹配就执行它,后面即便还有同名文件也不会再继续查找。这也解释了两个常见现象:

  • “明明装了,为什么提示 command not found”:程序的可执行文件不在 PATH 列出的任何一个目录下,需要要么把程序所在目录加入 PATH,要么用绝对路径直接调用
  • “装了两个版本,为什么执行的总是旧版本”PATH 中排在前面的目录里存在一个同名的旧版本可执行文件,被优先匹配到,可以用 which <命令名> 查看当前实际会执行的是哪个路径下的文件

临时把一个目录加入 PATH(追加到已有值的末尾,保留原有目录):

Terminal window
export PATH="$PATH:/new/directory"

配置文件:变量在哪里被持久化设置

Section titled “配置文件:变量在哪里被持久化设置”

直接在终端里 export 的变量,只在当前会话中有效,关闭终端后失效。想要每次打开终端都自动生效,需要把 export 命令写进对应的配置文件,Shell 启动时会自动读取这些文件。以 bash 为例:

  • ~/.bashrc:交互式非登录 Shell 启动时读取,日常打开一个新终端窗口触发的通常是这种情况
  • ~/.profile(或 ~/.bash_profile,视发行版而定):登录 Shell 启动时读取,例如通过 SSH 登录、或者图形界面登录会话启动时
变量名 用途
HOME 当前用户的家目录路径
USER 当前登录的用户名
SHELL 当前登录会话默认使用的 Shell 路径
PWD 当前所在的工作目录
LANG 系统语言与地区设置