terminal

source 命令是干什么的?一篇讲清楚

很多人会照着教程执行 source ~/.zshrc,但并不真正理解 source 在做什么。搞懂它的作用和边界,shell 配置、环境变量和终端排障会顺很多。

发布时间

阅读信息

约 2 分钟

主题标签

source / shell / zsh

先说结论

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环境变量
上一篇 “zsh 为什么要搞 3 个配置文件?从设计意图讲起” 下一篇 模型发布会那些榜单,到底在测什么