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 了。但有个坑——关掉终端,设置就丢了。

⚠️ 我曾经踩过的坑:有次帮同事调试烧录脚本,他死活说环境变量配好了,但烧录工具就是找不到。我过去一看,他在终端 A 里 export 了路径,然后在终端 B 里运行脚本。嗯,两个终端的环境变量是独立的,互不共享。

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
💡 我的个人习惯:在 .profile 里只放环境变量,在 .bashrc 里放别名和函数。这样结构清晰,出了问题也好排查。你可以在 .bashrc 末尾加一行 source ~/.profile,这样非登录 shell 也能读到 .profile 里的变量。

source:让配置「立即生效」

改完 .bashrc 或 .profile 后,如果不想关掉终端重开,可以用 source 命令让配置立即生效:

source ~/.bashrc
# 或者简写为
. ~/.bashrc

source 的作用说白了就是「在当前 shell 里执行这个文件」。它跟直接运行脚本的区别在于:

  • 直接运行脚本:会开一个子 shell,脚本里 export 的变量不会影响当前 shell
  • source 执行:在当前 shell 里执行,export 的变量直接生效

为什么会这样?因为 export 只对当前 shell 及其子进程生效。子 shell 里 export 的东西,子 shell 一退出就没了。

🔑 记住这个原则:想让环境变量影响当前终端,就用 source;如果只是临时跑个脚本,直接执行就行。

实战:配置嵌入式交叉编译链

咱们拿嵌入式开发最常见的场景举个例子——配置 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 的关系串起来了,你可以对照着理解:

Linux 环境变量配置知识体系 环境变量 export 命令 .bashrc 文件 .profile 文件 source 命令 临时生效 仅当前终端有效 关掉终端就丢失 适合调试测试 bash 专属配置 每次打开终端加载 放别名、函数、补全 非登录 shell 也加载 跨 shell 配置 登录 shell 时加载 放环境变量 SSH 登录时生效 立即生效 不重启终端 当前 shell 执行 子 shell 不继承 核心工作流:export 测试 → 写入 .bashrc/.profile → source 生效 先临时验证,再永久配置,最后立即生效 提示:嵌入式开发建议将工具链路径写入 .profile,确保所有 shell 都能读到

避坑指南

最后,分享几个我这些年踩过的坑,你遇到了可以直接拿来用:

  • 路径写错不报错: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 路径,都是同样的套路。