Linux 环境变量
环境变量是 Linux 程序之间传递配置的标准方式——程序启动时从父进程继承它们。终端提示符的样式、命令搜索路径、编辑器选择、代理设置、语言环境,都通过环境变量控制。这一篇把它一次讲清楚。
1. 查看环境变量
查看环境变量有几种命令,用途略有不同:
# 查看环境变量
# env:列出所有环境变量
env
# SHELL=/bin/bash
# HOME=/home/aden
# USER=aden
# PATH=/usr/local/bin:/usr/bin:/bin:...
# LANG=zh_CN.UTF-8
# printenv:打印指定变量(更精确)
printenv HOME # 只看 HOME
printenv PATH # 只看 PATH
echo $HOME # echo 也能看,但要加 $
# set:列出所有变量(含 Shell 变量和函数,最多)
set | grep USER日常用 echo $VAR 看单个变量最快;要看全部用 env。
2. Shell 变量 vs 环境变量
这是新手最容易混淆的概念,弄清楚很关键:
# Shell 变量 vs 环境变量
# Shell 变量:只在当前 Shell 可见,子进程看不到
MY_VAR="hello"
echo $MY_VAR # 当前 Shell 能看到
# 环境变量:用 export 导出,子进程能继承
export MY_ENV="world"
bash # 开一个子 Shell
echo $MY_ENV # world(子进程能继承)
echo $MY_VAR # 空(子进程看不到)
# 一次性设环境变量(只对这一条命令生效)
EDITOR=vim crontab -e
# crontab 启动编辑器时,EDITOR 是 vim
# 命令结束后 EDITER 不再存在
# 取消变量
unset MY_VAR
unset MY_ENV核心区别:Shell 变量只在当前 Shell 可见;环境变量(export 过的)能被子进程继承。所以你想让一个 Node.js 程序读到 NODE_ENV,必须用 export 导出,否则它只是当前 Shell 的局部变量。
3. PATH:最重要的环境变量
当你输入 ls 时,Shell 怎么知道 ls 在哪?答案就是 PATH——它是一串用冒号分隔的目录,Shell 从前往后依次在这些目录里找命令。
# PATH:命令搜索路径(最重要的环境变量)
# 当你输入 ls 时,Shell 去 PATH 列出的目录里依次找 ls
echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 用冒号分隔,从前到后找。先找到的就先用
# 查看某个命令实际用的哪个文件
which python3 # /usr/bin/python3
which -a python3 # 列出所有名为 python3 的命令
type ll # ll 是 alias(别名)还是命令
# 临时把目录加到 PATH(只在当前 Shell 有效)
export PATH="$HOME/bin:$PATH" # 加在最前(优先用你的)
export PATH="$PATH:$HOME/bin" # 加在最后(系统命令优先)
# 永久生效:写进 ~/.bashrc(下面讲)常见操作:把 $HOME/bin 或 $HOME/.local/bin 加到 PATH,这样你自己装的命令(pip --user、cargo install 装的)就能直接用了。加到最前还是最后有讲究:加最前意味着你的同名命令会覆盖系统命令。
4. 常见的环境变量
记住这几个常用的,排错时经常会查:
# 常见的环境变量
echo $HOME # 用户主目录(/home/aden)
echo $USER # 当前用户名
echo $SHELL # 默认 Shell(/bin/bash)
echo $PWD # 当前目录(等于 pwd 命令)
echo $OLDPWD # 上一次的目录(cd - 回去)
echo $LANG # 语言/locale(zh_CN.UTF-8)
echo $TERM # 终端类型(xterm-256color)
echo $EDITOR # 默认编辑器(vim 或 nano)
echo $HOSTNAME # 主机名
# 几个开发常用的
echo $JAVA_HOME # JDK 安装路径
echo $NODE_ENV # Node.js 环境(production/development)
echo $PYTHONPATH # Python 模块搜索路径
echo $http_proxy # 代理设置5. 永久配置:bashrc 与 profile
直接在命令行 export 的变量,关掉终端就没了。要永久生效,得写进配置文件,关键是搞清楚哪个文件什么时候加载:
# 永久配置:几个配置文件的区别
# 按加载时机排:
# /etc/profile 系统级,所有用户登录时加载
# /etc/bash.bashrc 系统级,每次开 bash 加载
# ~/.bash_profile 用户级,登录时加载(只一次)
# ~/.bashrc 用户级,每次开新 bash 加载(最常改)
# ~/.profile 用户级,登录时加载(兼容非 bash)
# 把配置写进 ~/.bashrc(对当前用户永久生效)
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
echo 'export EDITOR=vim' >> ~/.bashrc
echo 'alias ll="ls -lah"' >> ~/.bashrc
# 改完后让它立即生效(否则要重开终端)
source ~/.bashrc
# source = . (简写):在当前 Shell 执行脚本(不开子 Shell)
# 关键:不加 source,改的 PATH 在当前 Shell 里不生效新手只需记住一条:把你的个性化配置(别名、PATH、提示符)写进 ~/.bashrc,然后用 source ~/.bashrc 立即生效。source 很关键——它是"在当前 Shell 执行脚本",不加的话配置不会影响当前终端。
注意 macOS 默认 Shell 已经是 zsh,配置文件是 ~/.zshrc 而非 ~/.bashrc。
6. alias:给命令起别名
alias 让你把又长又难记的命令简化:
# alias:给长命令起个短名字
# 查看已有别名
alias
# alias ll='ls -l'
# alias la='ls -A'
# alias l='ls -CF'
# 临时设别名(关终端就没了)
alias ll='ls -lah'
alias gs='git status'
alias dc='docker compose'
alias ..='cd ..'
alias ...='cd ../..'
# 永久生效:写进 ~/.bashrc
echo "alias ll='ls -lah'" >> ~/.bashrc
source ~/.bashrc
# 取消别名
unalias ll
# 想用命令本身的版本,加斜杠:ls 或 /bin/ls把高频命令都设成别名,效率倍增。写进 ~/.bashrc 永久生效。注意别名优先于命令本身——如果你定义了 alias rm='rm -i',以后 rm 都会问你确认,要用原始 rm 就 \rm 或 /bin/rm。
7. 实战:开发场景
配置代理是开发里最常见的环境变量用法:
# 开发场景:配置代理
# 临时(当前 Shell)
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5://127.0.0.1:7890"
# 取消
unset http_proxy https_proxy all_proxy
# 只对单条命令用代理(用 env)
http_proxy=http://127.0.0.1:7890 curl https://www.google.com
# 永久写进 ~/.bashrc(可选)
# 或者更优雅:写个函数 toggle_proxy,需要时再开类似地,Java 配 JAVA_HOME、Node 配 NODE_ENV、Python 配 PYTHONPATH 都是一回事——export 写进 ~/.bashrc,或用 .env 文件配合 dotenv 库管理。
8. 排查"command not found"
新手最常见的报错。排查思路:
- 命令装了吗?
which 命令名看能不能找到。 - 装了但不在 PATH 里?检查
echo $PATH,看命令所在目录在不在。 - 是用户级安装(pip --user)吗?目录可能是
~/.local/bin,要加进 PATH。 - 新装的命令要
hash -r刷新 Shell 的命令缓存。 - 执行权限有吗?
chmod +x 文件。
小结
这一篇你掌握了环境变量的查看、设置、导出、持久化:用 env/echo $VAR 查看、export 导出给子进程、配置 PATH 让命令能被找到、写进 ~/.bashrc 永久生效、用 alias 起别名。下一篇讲服务器上的"急救工具"——Vim 编辑器。
← 上一篇 Shell 脚本入门
下一篇 Vim 编辑器 →