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
--- name: trellisx-workspace description: 维护 `.trellis/task.md` 任务看板 —— trellis 缺的跨任务总览。**一个表格, 一行一个任务**, 列为 id/名称/描述/状态/阶段/进度/worktree (状态/阶段中文显示)。在 task create/start/阶段切换/archive 后**及时更新**对应行; 并**自动清理超 7 天的已完成行**防膨胀。保持看板与 task.json 实时一致。 when_to_use: 维护 / 创建 / 更新 `.trellis/task.md` 任务看板时; task 生命周期任一节点 (create/start/阶段推进/archive) 之后同步看板时; 用户问"当前有哪些任务 / 任务进度 / 任务看板"时。被 trellisx-flow 与 trellisx-apply 注入的流程引用。 user-invocable: true argument-hint: [show|update|sync|cleanup ...] [task id] arguments:
testing
强制以 Trellis task 闭环处理用户指定的请求 (自判新建/并入 → plan→exec→check→finish 全程不跳步)。**仅用户显式主动调用** (/trellisx-flow 或明确要求"强制走 task 处理这个"); **禁止自动 / 被动 / 推断式调用** —— 不要因为某个请求"看起来该建 task"就自动触发本 skill, 那是 apply 注入的 no_task 倾向的职责。
testing
把 强推task + subtask拆分 + worktree隔离 + 闭环收尾 四维度增量注入当前项目 .trellis/ (workflow.md 的 no_task/planning/in_progress 块 + spec 背书文档 + trellis 生命周期 hook worktree 自动化)。强推 task 与闭环为纯 prompt 软约束 (非平台 hook 硬拦截)。**纯增量追加, 绝不替换 trellis 原生文本** (no_task 分类+征同意/check/finish/前缀全保留)。幂等 (marker 包裹)。
development
Claude Code 会话历史整理 — 扫 ~/.claude/projects/**/*.jsonl 全部 session transcripts, 提取学习增量 (用户校正/决策/踩坑/L0 规则) → 全局记忆库 ~/.cortex/.wiki/memory/. 默认 --apply 落盘 (--dry-run opt-in 仅出 JSON plan 预览). 与 cortex-extract (L4-inbox 内部) 互补.