command not found、脚本里 java 找不到、crontab 里命令不生效——这些问题的根子往往都在环境变量。环境变量是系统传给程序的一组"全局设置",其中最常打交道的就是 PATH。这篇文章讲清楚环境变量是什么、怎么查看设置、以及最常见的坑。
一、什么是环境变量
环境变量是"名字=值"的键值对,进程启动时会从父进程继承。比如 PATH 决定你在哪找命令、HOME 是你的家目录、LANG 决定语言编码:
echo $HOME # 输出 /root
echo $PATH # 输出命令搜索路径,用冒号分隔
env # 查看全部环境变量
env | grep -i path
二、PATH:为什么 command not found
PATH 是一串目录,用冒号分隔。你敲 ls 时,系统按顺序在这些目录里找 ls 这个可执行文件:
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
which nginx # 看命令在哪:/usr/sbin/nginx
command not found 的两种情况:
- 命令没装:
yum install -y 包名或apt install -y 包名; - 装了但不在 PATH:程序装在
/usr/local/xxx/bin等目录,需要把目录加进 PATH。
临时加 PATH:
export PATH=/usr/local/go/bin:$PATH # 当前会话生效
三、设置环境变量:export 与 =
临时设置(当前终端有效):
export MY_VAR="hello" # 设置并导出,子进程可见
MY_VAR="hello" # 只对当前 shell 有效(不 export 子进程看不到)
永久设置(写入配置文件):
| 文件 | 作用 | 生效 |
|---|---|---|
~/.bashrc |
当前用户交互 shell | source ~/.bashrc |
~/.bash_profile |
当前用户登录时 | 重新登录 |
/etc/profile |
全局所有用户 | 重新登录 |
/etc/environment |
全局,纯键值对 | 重启 |
标准操作:在 ~/.bashrc 末尾追加:
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export TZ=Asia/Shanghai
然后 source ~/.bashrc 立即生效。
四、实战场景
1. 程序装了但 command not found(如 go/java)
# 在 ~/.bashrc 里追加
export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc
2. 脚本里使用环境变量
#! /bin/bash
echo "部署到 $SERVER_IP"
if [ -n "$API_KEY" ]; then echo "有 API Key"; fi
3. crontab 里命令不生效
cron 环境很干净,PATH 只有 /usr/bin:/bin。两种解法:
# 方案一:脚本内先导出(推荐)
#! /bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin
export LANG=en_US.UTF-8
# 你的命令...
# 方案二:crontab 里写全路径
0 3 * * * /usr/local/bin/backup.sh
4. 查看/清理变量
echo $VARNAME # 查看
unset VARNAME # 删除
set # 查看所有变量(含非导出)
5. 命令行临时设置
TZ=Asia/Shanghai date # 单条命令临时指定时区
LC_ALL=C grep "xxx" file # 单条命令用 C 语言环境
五、常见坑
- export PATH 写反覆盖系统 PATH:
export PATH=/usr/local/bin(少了$PATH)会导致ls、cat全部失效,登录都难受。补救:export PATH=/usr/bin:/bin:$PATH或用全路径/usr/bin/cat; - 改完没生效:修改
.bashrc后必须source ~/.bashrc或重开终端;改/etc/profile要重新登录; - cron 里环境变量全无:cron 不会加载
.bashrc,脚本开头先export或用source ~/.bashrc; - systemd 服务里变量不生效:在 service 文件
[Service]段写Environment="VAR=value",或EnvironmentFile=/etc/xxx.env; - 变量的引号与空格:
export A=hello world会报错,要export A="hello world";取变量尽量加引号"$A"。
六、systemd 服务里设置环境变量
[Service]
Environment="JAVA_HOME=/usr/local/jdk"
Environment="PATH=/usr/local/jdk/bin:/usr/local/bin:/usr/bin:/bin"
EnvironmentFile=/etc/myapp.env
改完 systemctl daemon-reload && systemctl restart 服务名。
总结:环境变量核心就三个操作——echo $变量 查看、export 变量=值 设置、写进 ~/.bashrc 永久化。最常踩的坑是 PATH 写丢 $PATH、cron/systemd 里环境变量不生效。记住:交互环境看 .bashrc,定时任务自己 export,systemd 用 Environment,环境变量问题就迎刃而解。




