unix/linux source 命令,其基本属性、语法、操作、api
现在像解剖精密仪器一样,来细致地审视 source
(或 .
) 命令的各个方面:它的属性、语法、操作方式,以及可以称之为“API”的交互接口。这种细致的分析有助于我们精确地理解和使用它。
让我们深入细节:
一、基本属性 (Core Attributes)
- 命令类型 (Command Type):
- Shell 内置命令 (Shell Builtin): 这是最核心的属性。
source
(和.
) 不是一个外部的可执行程序 (如/bin/ls
),而是由 Shell 自身直接实现和执行的命令。 - Implication:
- 效率高: 无需创建新进程来执行命令本身 (虽然被
source
的脚本中的外部命令仍会创建进程)。 - 直接访问 Shell 内部状态: 作为内置命令,它可以直接读取和修改当前 Shell 的内部数据结构(如变量表、函数表、环境)。这是它能够改变当前 Shell 环境的根本原因。
- 不依赖
PATH
(对命令本身而言): 你不需要担心PATH
环境变量是否设置正确才能找到source
或.
命令,因为它们是 Shell 的一部分。
- 效率高: 无需创建新进程来执行命令本身 (虽然被
- Shell 内置命令 (Shell Builtin): 这是最核心的属性。
- 执行上下文 (Execution Context):
- 当前 Shell 环境 (Current Shell Environment): 如前多次强调,这是其定义性属性。所有在被
source
的文件中执行的命令,都仿佛是直接在当前命令行提示符下输入的。
- 当前 Shell 环境 (Current Shell Environment): 如前多次强调,这是其定义性属性。所有在被
- 目的 (Purpose):
- 环境修改与代码加载 (Environment Modification & Code Loading): 主要用于加载配置文件、定义函数、设置变量、引入别名等,以改变或扩充当前 Shell 的功能和状态。
- 作用域 (Scope of Effect):
- 当前 Shell 会话 (Current Shell Session): 由
source
引入的改变(变量、函数等)仅对当前的 Shell 进程及其后续在该进程中执行的命令有效。当该 Shell 进程退出时,这些改变随之消失。它们不会自动影响已经存在的其他 Shell 进程,也不会影响新启动的(非子)Shell 进程(除非这些新 Shell 也会source
相同的或类似的配置文件)。
- 当前 Shell 会话 (Current Shell Session): 由
- 返回值 (Exit Status):
source
(或.
) 命令的退出状态码 ($?
) 通常是被source
的脚本中最后一条被执行的命令的退出状态码。- 如果文件不存在或不可读,
source
命令本身会失败,并返回一个非零的退出状态码。
二、语法 (Syntax)
基本的语法形式如下:
source FILENAME [ARGUMENTS ...]
. FILENAME [ARGUMENTS ...]
让我们分解一下:
source
或.
(点号):- 这是命令的关键字。两者在支持它们的 Shell (如 Bash, Zsh) 中功能等价。
- 在严格的 POSIX Shell 环境中,只保证
.
可用。
FILENAME
:- 必需参数。
- 指定要读取和执行命令的脚本文件的名称(路径)。
- 路径解析:
- 如果
FILENAME
包含斜杠 (/
)</
- 如果