plugins/languages/bash/skills/error/SKILL.md
Bash error handling conventions: set -euo pipefail strict mode, trap EXIT/ERR/INT for cleanup, mktemp + auto-removal, exit code design (0/1/2/64-78 sysexits), error propagation through functions, $? capture pitfalls, and || die patterns. Use when designing failure paths, cleanup logic, or hardening scripts against partial failure. Triggers on "trap 清理", "exit code", "set -e 陷阱", "mktemp", "错误处理 bash", "脚本健壮性", "信号处理 bash".
npx skillsauth add lazygophers/ccplugin bash-errorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
set -euo pipefail 开头。trap 清理。mktemp 创建临时文件 / 目录,不要自拼 /tmp/foo.$$。0 成功 / 1 一般错误 / 2 用法错误 / 64-78 见 <sysexits.h>。return N;脚本退出用 exit N;不要混用。$? 在下一条命令后即失效,需要立刻保存:rc=$?。set -e 不会触发的情形必须显式检查(见下"陷阱"段)。#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# 临时资源
tmpdir=$(mktemp -d -t myapp.XXXXXX)
bgpid=""
cleanup() {
local rc=$?
[[ -n "${bgpid}" ]] && kill "${bgpid}" 2>/dev/null || true
[[ -d "${tmpdir}" ]] && rm -rf -- "${tmpdir}"
exit "${rc}"
}
trap cleanup EXIT
trap 'echo "interrupted" >&2; exit 130' INT TERM
# 业务逻辑
long_running &
bgpid=$!
wait "${bgpid}"
注意:trap ... EXIT 中 exit $rc 是为了保持原始退出码。
on_err() {
local rc=$?
local lineno=$1
printf 'ERROR: line %d exit %d: %s\n' "${lineno}" "${rc}" "${BASH_COMMAND}" >&2
exit "${rc}"
}
trap 'on_err ${LINENO}' ERR
set -E 让 ERR trap 在函数 / 子 shell / 命令替换中继承。
set -e 在以下场景不会触发退出:
| 情形 | 示例 | 解决 |
|------|------|------|
| 管道非末位失败 | a \| b 且 a 失败 | 加 pipefail |
| 命令在 if/while/until 条件 | if cmd; then | 这是设计,确认即可 |
| && / \|\| 左侧失败 | cmd && other | 显式 if 或 \|\| die |
| 函数中错误返回但调用方在条件 | 见 Bash FAQ | 拆条件或 set -e 内部子 shell |
| 命令替换失败 | x=$(false) | Bash 4.4+ set -o inherit_errexit |
shopt -s inherit_errexit # Bash 4.4+,子 shell 继承 errexit
sysexits.h)readonly EX_OK=0
readonly EX_USAGE=64 # 命令行用法错
readonly EX_DATAERR=65 # 输入数据格式错
readonly EX_NOINPUT=66 # 输入文件不存在
readonly EX_NOPERM=77 # 权限不足
readonly EX_CONFIG=78 # 配置错误
readonly EX_SOFTWARE=70 # 内部软件错误
die() { printf 'fatal: %s\n' "$*" >&2; exit 1; }
cmd_must_succeed || die "cmd failed"
# 带恢复
cmd || { rc=$?; warn "fallback (rc=${rc})"; fallback; }
# 必需依赖
command -v jq >/dev/null 2>&1 || die "jq not installed"
# ❌ 错误:log 之后 $? 已是 log 的退出码
do_thing
log "done"
if [[ $? -ne 0 ]]; then ...; fi # bug
# ✅ 立即捕获
do_thing
rc=$?
log "done (rc=${rc})"
(( rc == 0 )) || die "do_thing failed"
# 管道每段的退出码
a | b | c
echo "${PIPESTATUS[@]}" # a b c 各自退出码
# 常见信号
# 1 HUP / 2 INT / 9 KILL(不可捕获) / 15 TERM
# 退出码 = 128 + signal
trap 'cleanup; exit 130' INT # Ctrl-C
trap 'cleanup; exit 143' TERM # kill
trap 'cleanup' EXIT # 正常退出 / die 后
# 文件
tmpfile=$(mktemp -t myapp.XXXXXX)
trap 'rm -f -- "${tmpfile}"' EXIT
# 目录(macOS/Linux 兼容写法)
tmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'myapp')
trap 'rm -rf -- "${tmpdir}"' EXIT
set -euo pipefail 开头mktemp + trap 清理ERR / EXIT / INT / TERM 各 trap 已规划|| die$? 立刻保存为本地变量PIPESTATUS 检查inherit_errexit,bash 4.4+)tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。