Linux 环境变量与路径 新手超详细教程环境变量是 Linux 系统运行时的全局公共参数而PATH是其中最核心的路径类环境变量—— 你在终端敲的所有命令系统能去哪里找到、能不能运行全由它决定。新手最常遇到的「命令找不到 command not found」「装了软件用不了」90% 都是环境变量和 PATH 配置的问题。从「基础概念→核心 PATH 变量→常用变量→配置方法→踩坑排查」逐层拆解每个知识点都配实操例子 逐行拆解 新手避坑提醒零基础也能看懂同时结合你嵌入式开发的场景给出实用案例。一、先理清三个概念变量、Shell 变量、环境变量1. 什么是变量和 Shell 脚本里的变量一样就是「给一段数据起个名字」通过名字就能读取对应的值方便程序和命令复用。2. 普通 Shell 变量 vs 环境变量这是新手最容易混淆的点核心区别是作用范围不一样类型作用范围子进程 / 程序能不能读到定义方式普通 Shell 变量仅当前终端 / 当前 Shell 内部有效不能子进程拿不到直接变量名值环境变量当前 Shell 它启动的所有子进程、程序、脚本 都能读到能全局共享用export导出的变量简单说环境变量就是「升级成全局生效」的 Shell 变量所有运行的程序都能读取它。实操例子直观感受区别你可以直接在终端跟着敲一眼就能看出差异# 1. 定义一个普通Shell变量 my_nameLinux学习者 echo $my_name # 当前终端能读到输出Linux学习者 # 2. 开一个子Shell相当于新开一个bash进程 bash echo $my_name # 输出空子进程读不到普通变量 exit # 退出子Shell回到原来的终端 # 3. 用export升级成环境变量 export my_nameLinux学习者 # 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 的值是一串用冒号:隔开的目录路径顺序就是系统查找命令的优先级顺序。例子查看当前系统的 PATHecho $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按CtrlO回车保存CtrlX退出编辑器。让配置立即生效不用重启终端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_lib2. 系统信息类变量①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 $HOMEprintenv 变量名查看单个变量的值printenv PATH2. 创建 / 修改环境变量临时生效当前终端export 变量名值# 自定义一个项目路径变量 export PROJECT_DIR/home/linuxlearn/ok62xx_project永久生效用户级写入~/.bashrc然后source生效永久生效系统级写入/etc/profile需要 root 权限3. 删除环境变量unset 变量名举例删除刚才定义的 PROJECT_DIRunset PROJECT_DIR echo $PROJECT_DIR # 输出空已经删除五、新手必懂配置文件加载顺序很多新手改了配置不生效本质是搞混了不同配置文件的加载时机。Linux 会根据 Shell 的类型加载不同的配置文件。两种 Shell 类型登录式 Shell比如 SSH 远程登录、su - 用户名切换用户、系统开机登录加载顺序/etc/profile→~/.bash_profile→~/.bashrc非登录式 Shell比如桌面点开终端、新开标签页、运行脚本加载顺序只加载~/.bashrc新手实用结论Ubuntu 桌面 / WSL 环境统一改~/.bashrc99% 的场景都能生效。嵌入式 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