把重复操作写成脚本:set -euo pipefail 之后还要做什么
一行 curl 拉数据、一行 jq 解析、一行写库——脚本写着写着就成了生产工具,但错误处理还停留在「能跑就行」。
脚本失败最怕的不是报错,是「静默地写了一半」。
先说结论
set -euo pipefail + trap 清理 + 参数校验 + 幂等设计,四条做到就够日常用。
- 开头统一 set -euo pipefail
- trap 清理临时文件与锁
- 入口校验参数与依赖命令是否存在
- 所有输出带时间戳,失败退出码非 0
先把问题说清楚
set -e 让脚本遇错即停,set -u 让未定义变量报错,pipefail 让管道中的失败不被吞掉。这三条能挡掉一半事故。
trap 保证异常退出时也能清理临时文件、释放锁。
具体怎么做
按顺序执行,每步都验证完再进下一步:
- 脚本开头:#!/usr/bin/env bash + set -euo pipefail
- 定义 usage 与参数校验,缺参数直接退出
- 用 mktemp 建临时文件,trap 'rm -f' EXIT
- 关键步骤打日志,错误信息写 stderr
- 设计幂等:重复执行不会产生重复数据
参数与成本对照
把关键数值摊开,方便判断该选哪条路:
| 写法 | 作用 | 常见错误 |
|---|---|---|
| set -e | 遇错退出 | 管道中失效 |
| set -u | 未定义变量报错 | 误用 $@ 空值 |
| pipefail | 管道失败可见 | 未开启导致静默 |
| trap | 清理资源 | 只写 EXIT 不写 ERR |

几个容易踩的坑
下面这些是最常见的错误做法:
- 不写 set -e:前半段失败后半段照跑
- rm -rf $DIR 而不校验变量:变量空时删库
- 硬编码路径:换机器就废
- 没有锁:定时任务重叠执行
最后补两句
脚本是「会被人信任的代码」,错误处理不是加分项,是及格线。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论