环境变量与 PATH
环境变量是操作系统层面维护的一组键值对,会被当前进程以及它启动的所有子进程继承。Shell 本身、Shell 里运行的每一个命令,都能读取这些变量来获取配置信息,这也是许多命令行工具的行为可以通过环境变量调整的原因。
查看与设置环境变量
Section titled “查看与设置环境变量”echo $HOME # 查看单个环境变量的值env # 列出当前会话的全部环境变量export MY_VAR="value" # 设置一个环境变量,并让子进程也能继承到MY_VAR="value" # 不加 export,只在当前 Shell 内有效,子进程读不到unset MY_VAR # 删除一个已设置的环境变量export 是这里的关键字:不加 export 的赋值只是一个普通的 Shell 变量,作用范围局限在当前 Shell 进程内部;加上 export 之后,这个变量才会被写入环境变量表,之后由这个 Shell 启动的任何子进程(例如执行的脚本、调用的程序)都能读取到它。
PATH:命令是怎么被找到的
Section titled “PATH:命令是怎么被找到的”PATH 是最常被直接接触到的环境变量之一,它的值是一串用冒号分隔的目录路径列表:
echo $PATH在 Shell 基础一节提到过,输入一个命令后,如果它不是内置命令,Shell 会按 PATH 列出的目录顺序依次查找同名的可执行文件,找到第一个匹配就执行它,后面即便还有同名文件也不会再继续查找。这也解释了两个常见现象:
- “明明装了,为什么提示 command not found”:程序的可执行文件不在
PATH列出的任何一个目录下,需要要么把程序所在目录加入PATH,要么用绝对路径直接调用 - “装了两个版本,为什么执行的总是旧版本”:
PATH中排在前面的目录里存在一个同名的旧版本可执行文件,被优先匹配到,可以用which <命令名>查看当前实际会执行的是哪个路径下的文件
临时把一个目录加入 PATH(追加到已有值的末尾,保留原有目录):
export PATH="$PATH:/new/directory"配置文件:变量在哪里被持久化设置
Section titled “配置文件:变量在哪里被持久化设置”直接在终端里 export 的变量,只在当前会话中有效,关闭终端后失效。想要每次打开终端都自动生效,需要把 export 命令写进对应的配置文件,Shell 启动时会自动读取这些文件。以 bash 为例:
~/.bashrc:交互式非登录 Shell 启动时读取,日常打开一个新终端窗口触发的通常是这种情况~/.profile(或~/.bash_profile,视发行版而定):登录 Shell 启动时读取,例如通过 SSH 登录、或者图形界面登录会话启动时
常见的内置环境变量
Section titled “常见的内置环境变量”| 变量名 | 用途 |
|---|---|
HOME |
当前用户的家目录路径 |
USER |
当前登录的用户名 |
SHELL |
当前登录会话默认使用的 Shell 路径 |
PWD |
当前所在的工作目录 |
LANG |
系统语言与地区设置 |