Linux 环境变量详解:PATH、export、.bashrc 与常见坑


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 的两种情况:

  1. 命令没装:yum install -y 包名 或 apt install -y 包名;
  2. 装了但不在 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 语言环境

五、常见坑

  1. export PATH 写反覆盖系统 PATH:export PATH=/usr/local/bin(少了 $PATH)会导致 ls、cat 全部失效,登录都难受。补救:export PATH=/usr/bin:/bin:$PATH 或用全路径 /usr/bin/cat;
  2. 改完没生效:修改 .bashrc 后必须 source ~/.bashrc 或重开终端;改 /etc/profile 要重新登录;
  3. cron 里环境变量全无:cron 不会加载 .bashrc,脚本开头先 export 或用 source ~/.bashrc;
  4. systemd 服务里变量不生效:在 service 文件 [Service] 段写 Environment="VAR=value",或 EnvironmentFile=/etc/xxx.env;
  5. 变量的引号与空格: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,环境变量问题就迎刃而解。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 网络诊断工具详解:ping、traceroute、dig、nslookup 实战

Linux 进程管理实战:ps、top、kill 与 nohup 后台运行

评 论
更换验证码