移动H3_2S光猫超级管理员权限获取与桥接模式设置全攻略
2026/8/3 22:43:03
在 Shell 脚本中,通过sh 1.sh、bash 1.sh、source 1.sh或. 1.sh调用子脚本,行为有本质区别,主要体现在执行环境(进程/作用域)和变量/函数可见性上。
| 调用方式 | 是否新建子进程 | 能否修改父脚本变量 | 能否继承父脚本变量 | 能否使用父脚本函数 | 执行速度 | 典型用途 |
|---|---|---|---|---|---|---|
sh 1.sh | ✅ 是 | ❌ 不能 | ❌ 仅export的 | ❌ 不能 | 稍慢 | 独立任务、隔离执行 |
bash 1.sh | ✅ 是 | ❌ 不能 | ❌ 仅export的 | ❌ 不能 | 稍慢 | 同上(指定 bash) |
source 1.sh | ❌ 否 | ✅ 能 | ✅ 全部 | ✅ 能 | 快 | 加载配置、共享状态 |
. 1.sh(点命令) | ❌ 否 | ✅ 能 | ✅ 全部 | ✅ 能 | 快 | 同source(POSIX 标准) |
sh 1.sh或bash 1.sh:启动新进程1.sh。export)对子脚本不可见。exit,也只退出子进程,不影响父脚本继续执行。📌 示例:
# parent.shname="Alice"shchild.sh# child.sh 里 echo $name → 空(除非 export name)echo$name# 仍为 "Alice"
source 1.sh或. 1.sh:在当前 Shell 中执行1.sh。exit,整个父脚本会退出!. 1.sh是 POSIX 标准写法,source是 Bash/Zsh 的别名,功能相同。📌 示例:
# parent.shname="Alice"sourcechild.sh# child.sh 中 name="Bob" → 父脚本 name 变为 "Bob"echo$name# 输出 "Bob"
| 场景 | 推荐方式 | 原因 |
|---|---|---|
加载配置文件(如.env) | source config.sh | 需要将变量导入当前环境 |
| 执行独立部署任务 | bash deploy.sh | 隔离环境,避免污染父脚本 |
| 在脚本中复用函数库 | source lib.sh | 直接调用库中的函数 |
| 临时测试脚本 | sh test.sh | 不影响当前 Shell 状态 |
| 在 Dockerfile 或 CI 中运行 | sh entrypoint.sh | 通常需要独立进程 |
误用exit
在被source的脚本中写exit会导致整个终端或主脚本退出!
变量污染source时,子脚本的变量会覆盖父脚本同名变量(可用local限制作用域)。
路径问题source ./1.sh和sh ./1.sh对$0、$PWD的处理不同,影响相对路径解析。
source或.sh或bashsh更安全(隔离性好). script.sh(POSIX 兼容)echo$SHLVL# 每进一层子 shell +1总结一句话:
sh是“请别人帮你做事”,source是“你自己做这件事”。
前者隔离干净,后者共享状态。根据需求选择即可。