plugins/languages/bash/skills/core/SKILL.md
Bash / Shell core conventions covering Bash 5.2+ features, POSIX sh portability, strict mode (set -euo pipefail + IFS), quoting and parameter expansion, $(...) over backticks, printf over echo -e, [[ ]] over [ ], shebang selection, and macOS bash 3.2 legacy compatibility. Use when writing, reviewing, refactoring, or debugging any shell script. Also triggers on "Bash 脚本", "shell 脚本规范", "strict mode", "set -euo pipefail", "shellcheck", "shfmt", "POSIX sh 兼容", "bash 5.2", "macOS bash 3.2".
npx skillsauth add lazygophers/ccplugin bash-coreInstall 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.
应作为所有 Shell 任务(开发 / 调试 / 优化)的标准基线。其它 bash skill 在本文之上做领域细化。
| 主题 | 跳转 |
|------|------|
| 错误处理 / trap / exit code | bash-error |
| POSIX sh 兼容 / 跨 shell | bash-posix |
| 测试 / bats-core | bash-testing |
| 工具链 / shellcheck / shfmt | bash-tooling |
#!/usr/bin/env bash,POSIX sh 用 #!/bin/sh。shebang → set -euo pipefail → IFS=$'\n\t'。"${var}" 而非 $var,防止字段分割和 glob 展开。$(...) 而非 `...`,允许嵌套且更清晰。[[ ]](bash) 或 [ ](POSIX sh),禁止裸 test。printf '%s\n' 而非 echo -e(echo 的转义行为不可移植)。name() { ... }(不写 function name),便于 POSIX 兼容。local(bash) / 单独函数(POSIX sh)。shellcheck 与 shfmt 检查,零警告。eval 与 source 不受信内容;禁 cd $foo 无引号;禁未引号的 rm -rf $path。#!/usr/bin/env bash
# brief: 描述脚本目的
# usage: ./script.sh [args]
set -euo pipefail
IFS=$'\n\t'
# -e: 任意命令失败立即退出
# -u: 引用未定义变量立即退出
# -o pipefail: 管道中任意命令失败传播退出码
# IFS: 仅按换行和制表符分割,避免空格陷阱
POSIX sh 版本(无 pipefail):
#!/bin/sh
set -eu
# pipefail 在 POSIX 不可用;通过临时文件或 wait 显式处理
| 特性 | 语法 | 用途 |
|------|------|------|
| ${var@U/L/Q/E/P/A/K/a} | 参数转换 | 大小写 / 引号化 / 转义 |
| wait -p var | 等待并取 PID | 后台作业管理 |
| read -d '' | 读到 NUL | 安全处理含换行字段 |
| BASH_ARGV0 | 重写 $0 | 日志友好 |
| EPOCHSECONDS / EPOCHREALTIME | 内置时间 | 免 fork date |
| mapfile -d | 自定义分隔符 | 数组装载 |
| globskipdots | shopt | * 不再匹配 . / .. |
| 关联数组 | declare -A | 字典(Bash 4+) |
| ${var,,} / ${var^^} | 小写 / 大写 | 字符串处理 |
# ✅ 总是引用变量
name="hello world"
echo "${name}" # hello world
echo "$name" # 同上(最简形式)
# ✅ 数组展开必须 "${arr[@]}"
files=(a.txt "b c.txt")
for f in "${files[@]}"; do printf '%s\n' "$f"; done
# ❌ 未引号 → 字段分割 + glob
echo $name # 双词;若含 * 会展开
# ✅ 命令替换嵌套
size=$(du -sh "$(realpath "${path}")" | awk '{print $1}')
# ✅ 默认值 / 必需值
: "${VAR:=default}" # 未设置则赋默认
: "${REQUIRED:?must be set}" # 未设置则报错退出
# ✅ [[ ]] 支持模式 / 正则
[[ "${file}" == *.txt ]] && echo "text"
[[ "${str}" =~ ^[0-9]+$ ]] && echo "numeric"
# ✅ 算术比较
(( count > 0 )) && echo "non-empty"
# ✅ 算术赋值(不需要 $)
(( total = a + b ))
# ❌ 旧式 [ ](POSIX 限制;bash 内首选 [[ ]])
[ "$x" = "$y" ]
# ✅ 标准定义
greet() {
local name="${1:?missing name}"
local prefix="${2:-Hello}"
printf '%s, %s!\n' "${prefix}" "${name}"
}
# ✅ 返回值通过 stdout,状态通过 return
parse_count() {
local input="$1"
if [[ "${input}" =~ ^[0-9]+$ ]]; then
printf '%s' "${input}"
return 0
fi
return 1
}
count=$(parse_count "42") || { echo "bad input" >&2; exit 1; }
# ✅ 日志分级到 stderr,结果到 stdout
log() { printf '[%(%Y-%m-%dT%H:%M:%S)T] %s\n' -1 "$*" >&2; }
die() { log "FATAL: $*"; exit 1; }
warn() { log "WARN: $*"; }
# ✅ heredoc
cat <<EOF
config:
user: ${USER}
pwd: ${PWD}
EOF
# ✅ 不展开的 heredoc(保留 $)
cat <<'EOF'
literal $VAR
EOF
# ❌ 引发血案
rm -rf $path/
# ✅ 防御
[[ -n "${path:-}" ]] || die "path empty"
[[ "${path}" != "/" ]] || die "refuse to rm /"
rm -rf -- "${path}" # `--` 阻止 -name 当作选项
bash 用 env bash)set -euo pipefail + IFS=$'\n\t'"${var}"$(...)echo -e,统一 printfeval / 无未引号 rm -rftools
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 全自动修, 断链只报告)。