Linux 学习资料 https://pan.baidu.com/s/1A6qqBk2ViE_Le2cQjSowkQ?pwd=7uz8
一、命令简介
source 是 Bash 和其他类 Unix shell 的内建命令,用于在当前 Shell 环境中读取并执行指定文件中的命令。与在子 Shell 中执行脚本不同,source 会将文件中定义的变量、函数等直接加载到当前 Shell 会话中,使其对后续命令立即可用。
二、语法格式
bash
运行
source filename [arguments]或者使用等效的点号(.)语法:
bash
运行
. filename [arguments]参数说明:
- filename:必需。要读取和执行的文件路径。可以是绝对路径、相对路径,或通过 $PATH 环境变量查找的文件名(但通常建议使用完整路径)。
- arguments:可选。传递给文件中脚本的位置参数($1, $2, ... 等)。
三、常用选项及说明
source 是 Shell 内建命令,本身没有传统意义上的命令行选项。其行为完全由提供的文件名和参数决定。
四、示例用法
示例 1:加载 Shell 配置文件
最常见的用途是重新加载 Shell 配置文件(如 .bashrc, .bash_profile),使修改立即生效,而无需重新登录或启动新的 Shell 会话。
bash
运行
# 重新加载当前用户的 Bash 配置 source ~/.bashrc # 或者使用点号语法 . ~/.bash_profile示例 2:设置当前会话的环境变量
假设有一个文件 env_vars.sh,内容如下:
bash
运行
# env_vars.sh export DATABASE_URL="postgresql://localhost/mydb" export API_KEY="secret_key_123" alias ll='ls -alF'在当前 Shell 中执行:
bash
运行
source ./env_vars.sh执行后,DATABASE_URL 和 API_KEY 环境变量以及 ll 别名将在当前终端会话中可用。
示例 3:在脚本中使用 source 引入函数库
创建一个函数库文件 utils.sh:
bash
运行
# utils.sh function greet() { echo "Hello, $1!" } function calc_sum() { echo $((1+2)) }在主脚本或交互式 Shell 中引入并使用:
bash
运行
source ./utils.sh greet "Developer" # 输出:Hello, Developer! calc_sum 5 3 # 输出:8示例 4:向被 source 的文件传递参数
创建一个脚本 test_args.sh:
bash
运行
# test_args.sh echo "第一个参数是: $1" echo "第二个参数是: $2"执行并传递参数:
bash
运行
source ./test_args.sh arg1 arg2 # 输出: # 第一个参数是: arg1 # 第二个参数是: arg2五、注意事项
执行环境:source 与直接执行脚本(如 sh script.sh 或 ./script.sh)的关键区别在于执行环境。source 在当前 Shell 进程中执行文件,因此文件中的命令可以修改当前环境(如变量、工作目录)。而直接执行脚本通常会创建一个新的子 Shell 进程,其环境变化在脚本结束后不会影响父 Shell。
返回值:source 命令的退出状态(返回值)是被执行文件中最后一个命令的退出状态。如果文件无法读取,source 命令本身会失败。
路径搜索:虽然 source 会尝试在 $PATH 中查找文件,但为了清晰和避免意外,强烈建议使用文件的绝对路径或明确的相对路径。
安全性:由于 source 会直接在当前 Shell 环境中执行文件中的任何命令,因此只应对你完全信任的文件使用此命令,以避免意外的环境修改或安全风险。
与。的等效性:点号(.)是 source 的 POSIX 标准等效写法,可移植性更好。在编写需要跨不同 Shell 的脚本时,使用。更可靠。
错误处理:如果指定的文件不存在或不可读,Shell 会报错。在脚本中使用时,可以考虑检查 source 的返回值。
bash
运行
if source config.sh; then echo "配置加载成功。" else echo "配置加载失败!" >&2 exit 1 fi- 内建命令:source 是 Shell 内建命令,因此无法通过 man source 查看手册页。应使用 help source(Bash 中)或查看 Shell 的文档来获取帮助信息。