这是一个在 Linux/Unix 系统中非常基础且重要的命令,对于日常使用和系统管理至关重要。

source 命令是什么?
source 是一个 Shell 内建命令,它的作用是在当前 Shell 环境中执行一个脚本文件。
为了理解它的核心作用,我们需要区分它和直接执行脚本(如 ./script.sh)的根本不同:
| 特性 | source script.sh 或 script.sh |
./script.sh 或 bash script.sh |
|---|---|---|
| 执行环境 | 当前 Shell (父 Shell) | 子 Shell (一个新的、临时的 Shell) |
| 变量影响 | 脚本中设置的变量、函数等会永久保留在当前 Shell 中。 | 脚本执行结束后,所有变量和函数都会随子 Shell 一起销毁,不影响父 Shell。 |
| 执行方式 | Shell 会读取脚本文件中的内容,并逐行在当前 Shell 中执行。 | Shell 会创建一个新的进程(子进程),让这个子进程去加载并执行脚本。 |
| 常见用途 | - 加载环境变量配置文件 - 重新加载 Shell 配置(如 .bashrc)- 在脚本中复用其他脚本的功能(函数库) |
- 运行独立的程序或任务 - 执行一次性脚本,不希望污染当前环境 |
source 命令的核心用途
加载环境变量配置文件
这是 source 最常见的用途,很多软件的安装或配置需要设置环境变量(如 PATH, JAVA_HOME),这些配置通常保存在一个 .sh 文件中。
场景示例:安装 JDK 后设置环境变量

假设你下载了 Oracle JDK 并解压到了 /usr/lib/jvm/java-11-oracle,你需要将它的 bin 目录添加到系统的 PATH 变量中。
-
创建一个环境变量配置文件 (
/etc/profile.d/java.sh):sudo nano /etc/profile.d/java.sh
在文件中写入以下内容:
#!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-oracle export PATH=$JAVA_HOME/bin:$PATH
保存并退出。
(图片来源网络,侵删) -
让配置立即生效(不注销或重启): 如果你在新的终端窗口中,这些配置通常会在你登录时自动加载,但如果你想在当前终端立即生效,就需要使用
source:source /etc/profile.d/java.sh
或者使用它的简写形式 (点):
. /etc/profile.d/java.sh
-
验证是否生效:
echo $JAVA_HOME # 输出: /usr/lib/jvm/java-11-oracle echo $PATH # 输出: /usr/lib/jvm/java-11-oracle/bin:... (其他路径)
你可以看到,变量已经被成功设置在了当前的 Shell 会话中,如果你直接运行
java.sh,这些变量只会在那个子进程中存在,执行完就消失了。
重新加载 Shell 配置文件
当你修改了个人配置文件(如 ~/.bashrc, ~/.zshrc)后,你不需要注销再登录,只需 source 一下即可让修改立即生效。
场景示例:修改了 ~/.bashrc
-
你在
~/.bashrc文件末尾添加了一个别名:alias ll='ls -alF'
-
保存文件后,在终端中运行:
source ~/.bashrc
或者:
. ~/.bashrc
-
你就可以直接使用
ll命令了,无需重启终端。
在脚本中包含其他脚本(函数库)
当你有多个脚本,并且想复用一些函数或通用变量时,可以将这些公共代码写在一个独立的文件中,然后用 source 命令将其加载到当前脚本中。
场景示例:创建一个函数库
-
创建函数库文件
functions.sh:#!/bin/bash # 定义一个打印带时间戳日志的函数 log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } -
创建主脚本
main_script.sh:#!/bin/bash # 加载函数库 source ./functions.sh # 现在可以使用函数库中定义的函数了 log_message "Starting the main script..." # 执行一些其他操作... log_message "Main script finished."
-
执行主脚本:
chmod +x main_script.sh ./main_script.sh
输出将会是:
[2025-10-27 10:30:00] Starting the main script... [2025-10-27 10:30:00] Main script finished.
source 与 的关系
在大多数 Shell(如 Bash, Zsh, Dash)中,source 和 (点号) 是完全等价的。 是 source 的 POSIX 标准写法,因此在脚本中写 更具可移植性,但在日常交互式命令行中,source 更容易阅读和记忆。
# 这两种写法效果完全一样 source ~/.bashrc . ~/.bashrc
总结与最佳实践
| 命令 | 场景 | 为什么用 source? |
|---|---|---|
source my_env.sh |
加载环境变量配置 | 需要让变量对当前 Shell 会话及其后续命令永久有效。 |
source ~/.bashrc |
重新加载 Shell 配置 | 避免注销/登录,让配置修改立即生效。 |
source lib.sh |
包含函数库 | 将公共代码(函数、变量)引入当前脚本作用域,实现代码复用。 |
./my_script.sh |
运行一个独立的程序或任务 | 隔离执行环境,不污染当前 Shell 的变量和状态,是更安全的选择。 |
记住这个核心区别:
source是“融合”:把脚本内容融入当前 Shell。./script.sh是“委托”:让一个新 Shell 去干活。
掌握了 source 命令,你就能更高效地管理你的 Ubuntu 环境,无论是配置开发环境还是编写复杂的 Shell 脚本,都会更加得心应手。
