如何编写不污染环境且可返回指定退出码的可source Shell脚本
解决方案
最终可用的sourceable.sh代码
#!/bin/bash function main() { local var=5 source envSetter.sh } function __source_internal_wrapper() { # 局部变量存储退出码,不会泄漏到外部环境 local exit_code # 执行主逻辑,传入所有调用参数 main "$@" exit_code=$? # 清理所有自定义的函数,包括当前包装函数自身 unset -f main __source_internal_wrapper # 返回主逻辑的退出码 return $exit_code } # 执行包装函数,传入所有调用参数 __source_internal_wrapper "$@"
方案说明
完全满足全部3项要求:
- 环境变量正常保留:所有操作均在当前shell执行,未创建子shell,
envSetter.sh中设置的ENV_VAR等环境变量会完整保留在当前shell环境中。 - 无任何环境残留:
- main函数和包装函数
__source_internal_wrapper执行完成后会被主动unset,不会残留函数定义 - 用于存储退出码的
exit_code是包装函数的局部变量,函数执行结束后自动销毁,不会残留全局变量 - main函数内部定义的
var为局部变量,同样不会泄漏到外部环境
- main函数和包装函数
- 返回码符合预期:脚本最终执行的命令是
return $exit_code,返回值完全等于main函数的退出码,不受unset命令返回值的影响。
验证方法
你可以执行以下命令验证效果:
# 执行source操作 source sourceable.sh # 查看返回码,预期输出3 echo $? # 查看环境变量,预期输出6 echo $ENV_VAR # 验证无函数残留,执行以下两个命令均无输出 declare -f main declare -f __source_internal_wrapper # 验证无临时变量残留,输出为空 echo $exit_code
内容的提问来源于stack exchange,提问作者NPS
相关产品推荐
相关产品推荐

