--- #领域/Linux #复盘/0 ## 一句话描述 [____set退出脚本___] --- ## 核心规范 >空想不如行动,积累胜于苛求。 >实践 > 沉淀 > 完美主义 实践不是盲目行动,而是带着“小目标、可验证“的方向试错,实践后必须沉淀(比如记录问题、总结规律),否则就是低水平重复。 实践大于沉淀,沉淀大于完美;完美是沉淀的终局方向,沉淀是实践的复盘产物;分域施策,避坑落地,始于行动,终于迭代。 --- ## 三省沉淀法 - 达成了[__脚本基础异常时退出执行______]目标 - 遇到了[__并未覆盖所有异常______]问题 - 下次改进[__整理手动处理规范______] ## 个人理解 [__set -euo pipefail 标准用法,覆盖未定义、遇到错误,并接收第一个失败错误码______] ## 实践计划 #状态/待实践 1. [__整理手动处理异常规范______] 2. [________] 3. [________] --- ## 核心定义 1. set -u 检测到 [__未定义变量______] 时退出脚本 2. set -e 检测到 [____遇到错误____] 时退出脚本 3. set -o pipefail 接收 [____第一个失败命令的错误码____] 生产环境标配: 开启严格模式:覆盖变量、命令、管道三类错误检测 set -euo pipefail ### 示例 #### ✅ 示例一:set -u 未定义变量 ```bash #!/bin/bash # 未开启set -u:未定义变量被当作空值 echo "未开启-u:$undefined_var" # 输出"未开启-u:",脚本继续 echo "脚本执行到这里(未开启-u)" # 开启set -u:未定义变量直接报错 set -u echo "开启-u:$undefined_var" # 报错:line 8: undefined_var: unbound variable echo "脚本不会执行到这里(开启-u)" # 不会执行 ``` #### ✅ 示例二:set -e 遇到错误 ```bash #!/bin/bash # 未开启set -e:命令失败仍继续执行 ls /不存在的目录 # 报错:No such file or directory echo "脚本执行到这里(未开启-e)" # 仍会执行 # 开启set -e:命令失败直接退出 set -e ls /不存在的目录 # 报错后脚本退出 echo "脚本不会执行到这里(开启-e)" # 不会执行 ``` ### 避坑点 ⚠️ 避坑点1:set -e 部分场景失效 核心问题:set -e 不会捕获 if cmd ; then、cmd || true、未开pipefail的错误 解决方案:✅ 手动检查配合,set -o pipefail ```bash if ls /不存在的目录; then echo "成功" else err_code=$? echo "失败,错误码:$err_code" exit $err_code fi ``` ```bash ls /不存在的目录 | echo # 这里管道结果为 0 不会报错 # 需要配合 -o pipefail 来获取管道第一个错误来退出 ``` ⚠️ 避坑点2:set -u 对参数变量误判 核心问题:set -u 下, bash特性不会对 `$*`、`$@` 报错 解决方案:✅ 使用参数前先判断数量 ```bash if [ $# -lt 1 ]; then echo "请传入参数!" exit 1 fi echo "第一个参数:$1" ``` ⚠️ 避坑点3:pipefail 不直接导致脚本退出 核心问题:pipefail 仅修改管道错误码,需搭配 set -e 解决方案:✅ pipefail 必须搭配 set -e