source 命令是干什么的?一篇讲清楚
很多人会照着教程执行 source ~/.zshrc,但并不真正理解 source 在做什么。搞懂它的作用和边界,shell 配置、环境变量和终端排障会顺很多。
先说结论
source让当前 shell 直接读取并执行一个文件。
最常见的用途:改完 .zshrc、.bashrc 之后,让当前终端窗口立刻生效。
source ~/.zshrc- = 当前 shell 打开
~/.zshrc - = 把里面的命令在当前 shell 里执行一遍
shell 配置文件不是热更新的——改了 .zshrc,已经打开的终端不会自动重读。要么重开终端,要么 source 手动重载。
设计意图
shell 设计者需要解决一个问题:怎么把多个文件的配置合并到同一个 shell 进程里?
直接 ./script.sh 会起子进程,子进程里的变量和 alias 在脚本结束后就消失了。shell 需要一个”在当前进程里执行文件”的机制——这就是 source(POSIX 写作 .)。
.zshrc 里写 source $ZSH/oh-my-zsh.sh,就是用这个机制把 oh-my-zsh 的配置加载进当前 shell。咱们手动 source ~/.zshrc,做的是同样的事——让当前 shell 重新执行这个文件。
source 最适合用在哪
最常见就是三类场景。
1. 改完 shell 配置,想立刻生效
比如:
.zshrc.bashrc.zprofile.bash_profile
source 一下,当前窗口立刻生效。
2. 临时加载一份环境变量脚本
比如项目里有:
source env.local.sh
目的是把里面的 export 直接注入当前 shell。
3. 重载 alias、函数、补全配置
这类本来就属于 shell 自己的东西,source 正好对口。
改完没生效?先问自己三件事
1. 我改的是哪个文件?
.zshrc?.zprofile?.bashrc?- 项目里的某个脚本?
2. 我想影响的是哪个进程?
- 当前终端
- 新开的终端
- IDE
- GUI App
3. 那个进程启动时,会不会读取这个文件?
如果会,source 就能解决。如果不会,再 source 也没用。
一张图总结
修改配置文件
↓
文件内容变了
↓
当前 shell 不会自动重读
↓
要么重开终端
要么 source 这个文件
↓
当前 shell 重新执行文件内容
↓
alias / export / 函数在当前窗口生效
最后记一句就够了
source只做一件事:在当前 shell 里执行一个文件。剩下的都是推论。
如果也经常被环境变量不生效、IDE 和终端表现不一致这类问题卡住,欢迎关注我的公众号 粒方Lab。我会继续写这类真正能减少排障时间的开发环境经验。
sourceshellzshbashterminal环境变量