Linux 环境变量配置:export、.bashrc、.profile 与 source
环境变量这东西,说白了就是操作系统给程序准备的一张小纸条。程序启动时看一眼,就知道该去哪找库、用户的家目录在哪、用什么编辑器。我刚开始学嵌入式那会儿,总觉得配环境变量是件玄学——明明照着教程敲了,重启终端又没了。后来才明白,问题出在没搞清楚「临时配置」和「永久配置」的区别。
这一节,咱们就把 export、.bashrc、.profile 和 source 这四个东西彻底捋清楚。你想想看,搞嵌入式开发,每天要跟交叉编译链、烧录工具、SDK 路径打交道,环境变量配不好,光找路径就能浪费半小时。
export:临时生效的「小纸条」
export 是 Linux 里最直接的环境变量设置命令。用法很简单:
export MY_VAR="hello"
export PATH=$PATH:/home/user/tools
执行完这两句,当前终端会话里就能用 $MY_VAR 和新的 PATH 了。但有个坑——关掉终端,设置就丢了。
export 的典型用法就三种场景:
- 临时测试:想试试新工具链,先 export 一下看看能不能用
- 脚本内部:写个构建脚本,在脚本开头 export 需要的变量
- 调试排错:怀疑环境变量有问题,手动 export 覆盖看看效果
我个人习惯,在调试阶段先用 export 确认变量值对不对,确认没问题了再写到配置文件里。这样能避免把错误配置写进永久文件,省得后面还要改回来。
.bashrc 与 .profile:永久配置的「两兄弟」
想让环境变量每次打开终端都自动生效,就得写到配置文件里。Linux 下主要有两个文件:~/.bashrc 和 ~/.profile(或者 ~/.bash_profile)。
| 文件 | 加载时机 | 典型用途 |
|---|---|---|
~/.bashrc |
每次打开新的 bash 终端时 | 别名、函数、终端提示符、PATH 等 |
~/.profile |
登录 shell 时(如 SSH 登录) | 跨 shell 的环境变量、启动程序 |
~/.bash_profile |
登录 shell 时(bash 专用) | 如果存在,会覆盖 .profile |
这里有个容易混淆的地方:什么时候用 .bashrc,什么时候用 .profile?
我一般这样区分:
- 如果只是给 bash 用的(别名、函数、补全),放 .bashrc
- 如果是所有 shell 都需要的环境变量(比如交叉编译链路径),放 .profile
- 嵌入式开发常用的工具链路径、烧录脚本路径,我建议放 .profile,因为有时候你会用 sh、dash 等其他 shell
source ~/.profile,这样非登录 shell 也能读到 .profile 里的变量。
source:让配置「立即生效」
改完 .bashrc 或 .profile 后,如果不想关掉终端重开,可以用 source 命令让配置立即生效:
source ~/.bashrc
# 或者简写为
. ~/.bashrc
source 的作用说白了就是「在当前 shell 里执行这个文件」。它跟直接运行脚本的区别在于:
- 直接运行脚本:会开一个子 shell,脚本里 export 的变量不会影响当前 shell
- source 执行:在当前 shell 里执行,export 的变量直接生效
为什么会这样?因为 export 只对当前 shell 及其子进程生效。子 shell 里 export 的东西,子 shell 一退出就没了。
实战:配置嵌入式交叉编译链
咱们拿嵌入式开发最常见的场景举个例子——配置 ARM 交叉编译链。假设你的工具链装在 /opt/arm-gcc/bin 下:
# 1. 临时测试
export PATH=$PATH:/opt/arm-gcc/bin
arm-none-eabi-gcc --version # 确认能用
# 2. 确认没问题后,写入 .profile
echo 'export PATH=$PATH:/opt/arm-gcc/bin' >> ~/.profile
# 3. 立即生效
source ~/.profile
我在项目中遇到过好几次这样的问题:同事把路径写错了,或者写到了 .bashrc 里但用的是 sh 而不是 bash,结果编译脚本死活找不到编译器。所以我的建议是——先 export 测试,再写入文件,最后 source 验证。三步走,稳得很。
知识体系总览
下面这张图把 export、.bashrc、.profile 和 source 的关系串起来了,你可以对照着理解:
避坑指南
最后,分享几个我这些年踩过的坑,你遇到了可以直接拿来用:
- 路径写错不报错:export 一个不存在的路径,Linux 不会提示你。所以一定要用
echo $PATH确认一下 - 重复追加 PATH:每次 source 都会在 PATH 末尾追加一次,source 十次就重复十次。我习惯在 .profile 里先检查一下:
[[ "$PATH" != */opt/arm-gcc/bin* ]] && export PATH=$PATH:/opt/arm-gcc/bin - ~/.bash_profile 覆盖 ~/.profile:如果两个文件同时存在,bash 只会加载 .bash_profile。所以要么只用其中一个,要么在 .bash_profile 里 source 一下 .profile
- SSH 登录不加载 .bashrc:SSH 登录默认走 .profile,不会加载 .bashrc。如果你把环境变量写在 .bashrc 里,SSH 过去就找不到。解决方案是在 .profile 里加一行
source ~/.bashrc
环境变量配置说难不难,说简单也不简单。核心就四个命令、两个文件、一个原则——先测试、再写入、最后 source。搞清楚了,以后配交叉编译链、烧录工具、SDK 路径,都是同样的套路。