Linux 环境变量与路径 新手超详细教程
环境变量是 Linux 系统运行时的全局公共参数,而PATH是其中最核心的路径类环境变量—— 你在终端敲的所有命令,系统能去哪里找到、能不能运行,全由它决定。新手最常遇到的「命令找不到 command not found」「装了软件用不了」,90% 都是环境变量和 PATH 配置的问题。
从「基础概念→核心 PATH 变量→常用变量→配置方法→踩坑排查」逐层拆解,每个知识点都配实操例子 + 逐行拆解 + 新手避坑提醒,零基础也能看懂,同时结合你嵌入式开发的场景给出实用案例。
一、先理清三个概念:变量、Shell 变量、环境变量
1. 什么是变量?
和 Shell 脚本里的变量一样,就是「给一段数据起个名字」,通过名字就能读取对应的值,方便程序和命令复用。
2. 普通 Shell 变量 vs 环境变量
这是新手最容易混淆的点,核心区别是作用范围不一样:
| 类型 | 作用范围 | 子进程 / 程序能不能读到 | 定义方式 |
|---|---|---|---|
| 普通 Shell 变量 | 仅当前终端 / 当前 Shell 内部有效 | 不能,子进程拿不到 | 直接变量名=值 |
| 环境变量 | 当前 Shell + 它启动的所有子进程、程序、脚本 都能读到 | 能,全局共享 | 用export导出的变量 |
简单说:环境变量就是「升级成全局生效」的 Shell 变量,所有运行的程序都能读取它。
实操例子:直观感受区别
你可以直接在终端跟着敲,一眼就能看出差异:
# 1. 定义一个普通Shell变量 my_name="Linux学习者" echo $my_name # 当前终端能读到,输出:Linux学习者 # 2. 开一个子Shell(相当于新开一个bash进程) bash echo $my_name # 输出空!子进程读不到普通变量 exit # 退出子Shell,回到原来的终端 # 3. 用export升级成环境变量 export my_name="Linux学习者" # 4. 再开子Shell测试 bash echo $my_name # 能读到了!输出:Linux学习者 exit- 原理:
export的作用,就是把普通变量「导出」成环境变量,让所有子进程都能访问。
二、重中之重:PATH 路径变量
PATH是所有环境变量里最核心、你每天都在间接使用的一个,专门用来存放「系统搜索命令的目录列表」。
1. 灵魂拷问:为什么敲ls不用写全路径?
我们每天敲的ls、cd、cp这些命令,本质都是存放在/bin、/usr/bin目录下的可执行文件。
- 全路径写法是
/bin/ls,也能运行,但每次都写全路径太麻烦。 - 有了
PATH之后:你敲ls回车,系统会自动去PATH里记录的所有目录,按顺序挨个找有没有叫ls的文件,找到第一个就运行;所有目录都找不到,就报错command not found。
2. PATH 的格式:冒号分隔的目录列表
PATH 的值是一串用冒号:隔开的目录路径,顺序就是系统查找命令的优先级顺序。
例子:查看当前系统的 PATH
echo $PATH典型输出(Ubuntu):
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games逐段拆解含义:
| 目录 | 作用 |
|---|---|
/usr/local/sbin、/usr/local/bin | 用户自己编译安装的软件命令,优先级最高 |
/usr/sbin、/usr/bin | 系统预装的用户级命令,大部分常用命令都在这里 |
/sbin、/bin | 系统最基础的保命命令,单用户模式也能用 |
/usr/games | 游戏相关命令 |
查找逻辑:从左到右依次找,找到第一个匹配的命令就运行,后面的目录不再检查。 比如两个目录都有
ls,左边目录里的会优先生效。
3. 新手最高频报错:command not found的两个原因
- 原因 1:你根本没装这个软件→ 安装对应软件即可。
- 原因 2:软件装了,但它的目录不在 PATH 里→ 把软件的可执行文件目录加到 PATH 里就行。
- 典型场景:你安装了交叉编译工具、自定义程序,直接敲命令提示找不到,99% 是这个原因。
4. 实操:给 PATH 添加自定义目录
这是新手必须掌握的技能,我们以「嵌入式交叉编译工具链」为例:
场景:你把 ARM 交叉编译器装在了
/opt/gcc-arm-10.3/bin目录下,里面有arm-linux-gcc命令,但直接敲提示找不到。
方法一:临时生效(仅当前终端)
export PATH=$PATH:/opt/gcc-arm-10.3/bin逐成分拆解:
export PATH=:修改 PATH 环境变量$PATH:保留原来的所有 PATH 目录(必须加!不然会覆盖原有路径)::分隔符,用来追加新目录/opt/gcc-arm-10.3/bin:要添加的新目录
✅ 验证:
# 再敲命令就能找到了 arm-linux-gcc -v⚠️新手第一巨坑:不要覆盖 PATH!
- ❌ 错误写法:
export PATH=/opt/gcc-arm-10.3/bin - 后果:删掉了原来所有的系统目录,
ls、cd、cp所有命令都会提示找不到,终端直接「废掉」。 - ✅ 救急方法:用绝对路径恢复基础 PATH:
执行后基础命令就能用了,再重新正确配置即可。/usr/bin/export PATH=/usr/bin:/bin:/sbin
方法二:永久生效(当前用户,推荐)
临时方法关掉终端就失效了,要永久生效,需要把配置写到 Shell 的启动配置文件里。
Ubuntu/Debian 系统,新手统一改~/.bashrc就对了,这是当前用户的 Bash 终端配置文件,每次新开终端都会自动加载。
完整步骤:
- 用 nano 打开配置文件:
nano ~/.bashrc - 拉到文件最末尾,添加一行(和临时写法完全一样):
export PATH=$PATH:/opt/gcc-arm-10.3/bin - 按
Ctrl+O回车保存,Ctrl+X退出编辑器。 - 让配置立即生效(不用重启终端):
source ~/.bashrcsource的作用:让当前终端立刻加载修改后的配置文件,不用等下次开终端。
✅ 验证:新开一个终端,输入echo $PATH,能看到你加的目录就成功了。
方法三:永久生效(所有用户,系统级)
- 配置文件:
/etc/profile或/etc/environment - 需要 root 权限,会影响系统里所有用户,一般只有全局安装的软件才改,新手不建议操作。
5. 经典疑问:为什么当前目录的程序要写./才能运行?
比如你写了hello.sh脚本,直接敲hello.sh会报错,必须写./hello.sh才能运行,原因就是:
Linux 默认不会把当前目录
.加入 PATH。
为什么这么设计?安全原因!
如果当前目录在 PATH 里,坏人可以在/tmp目录下放一个叫ls的恶意脚本,你进到/tmp敲ls,运行的就不是系统命令,而是恶意脚本,非常危险。
./hello.sh的含义:明确告诉系统「运行当前目录下的 hello.sh」,不用去 PATH 里搜索,既安全又明确。
三、其他常用的路径 / 系统环境变量
除了 PATH,还有很多高频使用的环境变量,大多和路径、系统信息相关,新手记住这几个就够用了。
1. 路径类核心变量
①HOME:当前用户的家目录路径
- 作用:记录当前用户的个人目录绝对路径,我们常用的
~波浪号,就是$HOME的简写。 - 举例:
echo $HOME # 输出:/home/linuxlearn # 下面两行完全等价 cd ~ cd $HOME
②PWD:当前工作目录路径
- 作用:记录你当前所在的目录,和
pwd命令输出的结果完全一致,脚本里经常用它获取当前路径。 - 举例:
cd /etc echo $PWD # 输出:/etc
③LD_LIBRARY_PATH:动态库搜索路径(开发 / 嵌入式常用)
- 作用:和 PATH 类似,只不过 PATH 是找「可执行命令」,这个变量是找「.so 动态链接库文件」。
- 场景:程序运行时提示「找不到 xxx.so 库文件」,就把库所在的目录加到这个变量里。
- 举例:自己编译的库放在
/opt/my_lib,程序运行找不到库:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/my_lib
2. 系统信息类变量
①USER:当前登录的用户名
- 举例:
echo $USER→ 输出linuxlearn
②SHELL:当前使用的 Shell 解释器路径
- 举例:
echo $SHELL→ 输出/bin/bash
③LANG:系统语言与字符编码
- 作用:控制系统的显示语言、字符编码。
- 举例:
echo $LANG # 中文环境输出:zh_CN.UTF-8 # 英文环境输出:en_US.UTF-8
④HOSTNAME:主机名
- 作用:当前机器的主机名称。
四、环境变量完整操作手册
1. 查看环境变量
| 命令 | 作用 | 举例 |
|---|---|---|
env/printenv | 查看所有生效的环境变量 | 直接输入env回车,会列出全部 |
echo $变量名 | 查看单个变量的值(最常用) | echo $PATH、echo $HOME |
printenv 变量名 | 查看单个变量的值 | printenv PATH |
2. 创建 / 修改环境变量
- 临时生效(当前终端):
export 变量名=值# 自定义一个项目路径变量 export PROJECT_DIR=/home/linuxlearn/ok62xx_project - 永久生效(用户级):写入
~/.bashrc,然后source生效 - 永久生效(系统级):写入
/etc/profile,需要 root 权限
3. 删除环境变量
unset 变量名举例:删除刚才定义的 PROJECT_DIR
unset PROJECT_DIR echo $PROJECT_DIR # 输出空,已经删除五、新手必懂:配置文件加载顺序
很多新手改了配置不生效,本质是搞混了不同配置文件的加载时机。Linux 会根据 Shell 的类型,加载不同的配置文件。
两种 Shell 类型
- 登录式 Shell:比如 SSH 远程登录、
su - 用户名切换用户、系统开机登录- 加载顺序:
/etc/profile→~/.bash_profile→~/.bashrc
- 加载顺序:
- 非登录式 Shell:比如桌面点开终端、新开标签页、运行脚本
- 加载顺序:只加载
~/.bashrc
- 加载顺序:只加载
新手实用结论
- Ubuntu 桌面 / WSL 环境:统一改
~/.bashrc,99% 的场景都能生效。 - 嵌入式 SSH 登录环境:改
~/.bashrc也够用;如果不生效,就改~/.bash_profile。 - 改完配置不生效:要么执行
source 配置文件,要么新开一个终端试试。
六、结合 Shell 脚本的注意事项
脚本可以直接读取环境变量系统自带的环境变量(HOME、PATH、USER 等),在脚本里直接用
$变量名就能读,不用额外定义。#!/bin/bash echo "当前用户:$USER" echo "家目录:$HOME" echo "当前路径:$PWD"脚本里 export 的变量,默认不会影响外面的终端因为脚本默认在子 Shell里运行,脚本里的环境变量只在子进程里有效,脚本执行完就销毁了,不会影响父终端。
想让脚本里的变量作用于当前终端,用
source运行脚本比如你写了一个设置环境变量的脚本set_env.sh,直接运行没用,必须:source set_env.sh # 或者简写 . set_env.sh- 原理:source 是在当前 Shell 里直接执行脚本,不开子进程,变量就会保留下来。
七、新手高频踩坑总结
- PATH 被覆盖:修改 PATH 时忘了加
$PATH:,导致所有系统命令失效。- 救急:
/usr/bin/export PATH=/usr/bin:/bin:/sbin
- 救急:
- 改完配置不生效:忘记执行
source,或者改了错误的配置文件。 - 分不清普通变量和环境变量:脚本里定义的变量,子进程读不到,记得加
export。 - 当前目录程序直接敲名字运行:必须加
./,因为.默认不在 PATH 里。 - 路径里有空格:引用变量时一定要加双引号,比如
"$MY_PATH",不然会被拆成多个参数。
完整实操练习(贴合嵌入式场景)
你可以跟着走一遍,完整掌握 PATH 配置流程:
# 1. 先查看当前PATH echo $PATH # 2. 模拟创建一个工具目录和假命令 mkdir -p ~/my_tool/bin echo '#!/bin/bash' > ~/my_tool/bin/arm-test echo 'echo 交叉编译工具测试成功' >> ~/my_tool/bin/arm-test chmod +x ~/my_tool/bin/arm-test # 3. 直接敲命令,会报错找不到 arm-test # 4. 临时添加到PATH export PATH=$PATH:~/my_tool/bin # 5. 再运行,成功 arm-test # 6. 永久添加到.bashrc echo 'export PATH=$PATH:~/my_tool/bin' >> ~/.bashrc # 7. 生效配置 source ~/.bashrc # 8. 验证 echo $PATH | grep my_tool