source命令:别名是 (点),这是最常见、也最容易被问到的“点命令”。- (点) 命令本身:用于在当前目录下执行脚本。
source 命令 (别名 )
这是最核心、最常用的“点命令”,它的作用是在当前 Shell 环境中读取并执行一个 Shell 脚本文件。

基本语法
# 使用 source 关键字 source filename [arguments] # 使用 . (点) 作为别名 . filename [arguments]
source 和 是完全等价的,但 source 更具可读性,而 是一个历史悠久的传统写法。
核心作用:改变当前 Shell 环境
source 命令最关键的特点是:它不是创建一个新的子 Shell 来执行脚本,而是在当前的父 Shell 中执行。
这意味着,脚本中的所有命令(比如变量赋值、函数定义、目录切换 cd、修改环境变量 export 等)都会直接影响到当前的 Shell 会话。
与普通执行( 或直接写文件名)的对比
为了理解 source 的威力,我们首先要了解普通执行方式:

- 普通执行:当你使用
./script.sh或/path/to/script.sh执行脚本时,Linux 会创建一个新的子 Shell 来运行这个脚本,脚本执行完毕后,这个子 Shell 就会被销毁,它所做的所有改变(比如变量、cd目录)都不会影响到父 Shell。
举个例子,你就彻底明白了:
步骤 1:创建一个测试脚本
创建一个名为 test_script.sh 的文件,内容如下:
#!/bin/bash echo "--- Inside the script ---" echo "Current PID (Process ID): $$" # $$ 变量显示当前Shell的PID echo "Original directory: $(pwd)" # 定义一个变量 MY_VAR="I am set by the script" # 切换目录 cd /tmp echo "Changed directory to: $(pwd)" echo "Script finished." echo "------------------------"
步骤 2:普通执行()

打开一个终端,执行:
# 给脚本执行权限 chmod +x test_script.sh # 普通方式执行 ./test_script.sh
输出结果:
--- Inside the script ---
Current PID (Process ID): 12345 <-- 注意这个PID
Original directory: /home/user
Changed directory to: /tmp
Script finished.
------------------------
执行后,立即在同一个终端检查:
echo $MY_VAR pwd
输出结果:
<-- 变量 MY_VAR 是空的
/home/user <-- 当前目录没有改变,仍然是 /home/user
普通执行创建了一个新的子进程(PID 12345),脚本在其中运行并修改了环境,但父进程(你的终端)不受影响。
步骤 3:使用 source 命令执行
我们回到原始的 /home/user 目录,然后使用 source 命令执行同一个脚本:
pwd # 确认在 /home/user . test_script.sh # 或者使用 source test_script.sh
输出结果:
--- Inside the script ---
Current PID (Process ID): 12367 <-- 注意这个PID,和终端的PID一样!
Original directory: /home/user
Changed directory to: /tmp
Script finished.
------------------------
执行后,立即在同一个终端检查:
echo $MY_VAR pwd
输出结果:
I am set by the script <-- 变量 MY_VAR 成功设置!
/tmp <-- 当前目录真的切换到了 /tmp!
source 命令没有创建新的子进程,它直接在当前的终端 Shell 中执行脚本,脚本对环境的所有改变都永久地保留了下来。
source 的常见用途
-
加载环境变量配置文件 这是最经典的应用,很多软件(如 Node.js, Java, Python 虚拟环境)会提供一个
activate或env.sh文件来设置环境变量和路径,你必须使用source来加载它,否则这些变量只在子 Shell 中有效,退出子 Shell 后就失效了。# 加载 Python 虚拟环境 source myenv/bin/activate # 加载自定义的环境变量 source ~/.bashrc # 或 ~/.profile, ~/.zshrc 等
-
加载 Shell 函数库 你可以将常用的函数定义在一个文件中(
functions.sh),然后在其他脚本或命令行中通过source将其加载进来,直接使用这些函数。functions.sh文件内容:#!/bin/bash my_function() { echo "Hello from my_function!" }使用:
# 加载函数库 . ./functions.sh # 现在可以直接调用函数了 my_function # 输出: Hello from my_function!
-
重新加载配置文件 修改了
~/.bashrc或~/.zshrc后,通常需要重新登录才能生效,使用source可以在不登出的情况下立即让配置生效。source ~/.bashrc
(点) 命令本身 (在当前目录执行)
除了作为 source 的别名, 也是一个独立的命令,其作用是在当前 Shell 环境中执行一个文件。
基本语法
. filename [arguments]
这个命令和 source filename 的行为完全一样!它也是 source 命令的一个 POSIX 标准别名,在绝大多数情况下,你看到的 命令都是指 source。
历史用法(与 PATH 无关)
在早期或某些特定的 Shell 环境中, 命令还有一个用途:执行当前目录下的脚本,而不需要 前缀。
这与你是否将当前目录 添加到了 PATH 环境变量有关。
- 不在
PATH中:你必须使用./script.sh来执行当前目录下的脚本,因为 Shell 默认不会在当前目录查找可执行文件(出于安全考虑)。 - 在
PATH中:理论上你就可以直接输入script.sh来执行,但强烈不推荐将当前目录 加入PATH,因为这可能导致“命令劫持”安全风险(当你在一个恶意目录下时,攻击者可能放置一个同名的ls命令,而你无意中执行了它)。
而 命令提供了一种安全的方式来执行当前目录下的脚本,它不依赖于 PATH 变量,总是明确地表示“执行当前目录下的这个文件”。
在现代 Linux 系统中,你几乎可以认为 命令就是 source 命令的同义词,它的“在当前目录执行”的功能已经被 前缀所取代,并且其行为与 source 一致,即在当前 Shell 中执行。
总结与对比
| 特性 | source filename |
./filename (普通执行) |
|---|---|---|
| 别名 | (点) | 无 |
| 执行环境 | 当前 Shell (父 Shell) | 新的子 Shell |
| 变量影响 | 永久影响当前 Shell | 临时影响,子 Shell 销毁后丢失 |
cd 目录影响 |
永久改变当前 Shell 的目录 | 临时改变,不影响父 Shell |
| 性能 | 稍快,无需创建新进程 | 稍慢,需要创建新进程 |
| 主要用途 | 加载配置文件、函数库,使环境变量生效 | 独立运行一个脚本,不影响当前环境 |
简单记忆法则:
- 想让脚本的改变永久生效(比如设置环境变量、切换目录、定义函数),用
source或 。 - 想让脚本独立运行,执行完就完事,不影响当前环境,用 。
