讲解
环境变量是 shell 和进程之间传递配置的键值对,比如 HOME 指向家目录、USER 是当前用户名、LANG 决定语言编码。定义变量是 NAME="值"(等号两边不能有空格),取值时前面加 $:echo $NAME。定义出来的变量默认只在当前 shell 里有效,想让子进程(比如你启动的程序)也能看到,需要 export 导出——这是「shell 变量」和「环境变量」的区别,也是无数「我明明设了变量程序却读不到」问题的答案。
最重要的环境变量是 PATH:一个以冒号分隔的目录列表。你输入 ls 时,shell 按 PATH 里的顺序逐个目录查找叫 ls 的可执行文件,找到就执行,都找不到就报 command not found。所以「装了新命令却找不到」的排查第一步就是 echo $PATH 看它的安装目录在不在列表里。临时添加用 export PATH="$PATH:/新目录",注意一定要把原 PATH 带上,否则系统命令全丢。
「临时」是关键词:export 只对当前会话生效,关掉终端就没了。要永久生效,把 export 写进 shell 的启动配置文件:bash 是 ~/.bashrc(或 ~/.bash_profile),zsh 是 ~/.zshrc。改完后 source ~/.zshrc 立即生效,不用重开终端。查看变量用 env(全部环境变量)或 echo $变量名,删除用 unset。
示例
# 定义变量(等号两边不能有空格)并取值
NAME="Linux 学习者"
echo "你好,$NAME"
# 不加 export:子进程读不到
bash -c 'echo "子进程看到 NAME=[$NAME]"'
# export 之后:子进程就能读到了
export GREETING="早上好"
bash -c 'echo "子进程看到 GREETING=[$GREETING]"'
# PATH 是一个冒号分隔的目录列表,拆开看看(只显示前 5 个)
echo "$PATH" | tr ':' '
' | sed -n '1,5p'
# env 查看环境变量,unset 删除
export DEMO_VAR="临时变量"
env | grep DEMO_VAR
unset DEMO_VAR
env | grep DEMO_VAR || echo "DEMO_VAR 已被删除"
常见坑
- 等号两边加空格:NAME = "值" 会被当成运行叫 NAME 的命令,报 command not found。
- 设了变量没 export:当前 shell 里 echo 能看到,启动的程序却读不到。给程序用的变量都要 export。
- PATH 覆盖而不是追加:export PATH="/my/dir" 丢了原有路径,ls 都找不到。永远写 export PATH="$PATH:/my/dir"。
- 改了配置文件不生效:新配置只对新开的终端生效,当前窗口要 source ~/.zshrc 手动加载。
小结
变量赋值等号无空格,$ 取值,export 让子进程可见;PATH 决定命令去哪找,永久配置写进 ~/.zshrc 或 ~/.bashrc。下一节看两个提效工具:历史命令与别名。