把重复操作写成脚本:set -euo pipefail 之后还要做什么

效率 · 2 分钟阅读· 359 次阅读

一行 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)

阿
阿哲

照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。

南
南风

比「一键脚本」有用多了,知道为什么比知道怎么做重要。

K
Kevin

补充一句:不同版本行为会变,动手前先确认自己的版本号。

发表评论

验证码

提交后需站长审核,通过后才会显示。