在 linux shell 脚本中通过 source 或 . 命令加载外部函数库,使其函数在当前 shell 环境中可用;需确保库文件仅含函数定义、路径正确,且避免同名函数覆盖。

在 Linux shell 脚本中引入并调用外部函数库,核心是让当前脚本“加载”另一个脚本里的函数定义,使其在当前环境中可用。这不依赖编译或安装,纯靠 shell 解释器的执行上下文机制实现。
用 source 或点号(.)加载函数文件
这是最常用、最推荐的方式。它把外部脚本的内容“原样读入当前 shell 环境”,其中定义的函数、变量全部生效,后续可直接调用。
-
语法一致:两种写法等价 ——
source lib.sh和. lib.sh(注意点号后必须有空格) -
路径要正确:默认在当前工作目录查找;若在其他路径,需写相对或绝对路径,例如
source ./lib/common.sh或. /opt/myfuncs.sh - 无子 shell:不会新建进程,所以函数和变量能真正被主脚本继承
确保外部文件只定义函数,不立即执行
被加载的库文件(如 utils.sh)应只包含函数定义,避免顶部有 echo、ls 等命令,否则每次 source 都会执行一次,造成干扰。
示例 mathlib.sh:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
#!/bin/bash
add() {
echo $(($1 + $2))
}
mul() {
echo $(($1 * $2))
}主脚本中这样用:
#!/bin/bash source ./mathlib.sh result=$(add 5 3) echo "5 + 3 = $result" # 输出:5 + 3 = 8
函数名冲突与覆盖规则
如果主脚本和库文件中定义了同名函数,后加载的会覆盖先定义的 —— 没警告,也不报错。这点需特别注意。
- 建议给库函数加统一前缀,比如
mylib_add、mylib_log,降低冲突风险 - 可通过
declare -f 函数名查看当前已加载的函数代码,验证是否成功载入 - 用
declare -F可列出所有已定义函数名,快速确认库是否生效
不推荐用 sh 或 bash 单独执行库文件
像 sh lib.sh 或 bash lib.sh 会启动新 shell 进程运行该文件,函数定义仅在子进程中有效,退出后即消失,主脚本完全无法调用。
简单说:想“导入”,必须用 source 或 .;想“运行”,才用 sh。










