shellman是vscode中最轻量、响应最快的shell脚本骨架生成工具,内置check_deps、check_root等环境检查模板,安装后通过ctrl+shift+p调用insert snippet即可快速插入含shebang、set -euo pipefail及依赖校验的脚本骨架。

直接用 Shellman 插件插入预设模板
Shellman 是目前 VSCode 里最轻量、响应最快的 Shell 脚本骨架生成工具,它不依赖外部 CLI,也不需要配置 launch.json 或 shellcheck 路径,装完即用。关键在于它内置了带环境检查逻辑的常用模板,比如 check_deps、check_root、check_argc 等。
操作步骤很简单:
- 安装 Shellman 扩展(搜索
shellman,作者是hongyuanjun) - 新建一个
.sh文件,按Ctrl+Shift+P→ 输入Shellman: Insert Snippet→ 回车 - 从列表里选
bash_header_with_checks(含 shebang、set -euo pipefail、基础参数校验)或bash_script_with_deps(额外加入command -v检查依赖项)
生成的骨架会自动包含类似这样的逻辑:
#!/bin/bash
set -euo pipefail
<h1>Check if running as root</h1><p>[[ $EUID -ne 0 ]] && { echo "Error: This script must be run as root." >&2; exit 1; }</p><h1>Check required commands</h1><p>for cmd in curl jq sed; do
command -v "$cmd" >/dev/null 2>&1 || { echo "Error: $cmd is not installed." >&2; exit 1; }
done</p>
手动补全时别漏掉 set -euo pipefail 和变量引号
很多人复制模板后只改业务逻辑,却忽略两个致命细节:一是没启用严格模式,二是变量未加双引号。结果脚本在空格路径、空变量、管道失败时静默出错,排查成本翻倍。
必须写在脚本开头紧接 shebang 后面:
-
set -e:任一命令非零退出立即终止(但注意if、while内部不触发) -
set -u:引用未声明变量时报错(避免$USER_NAME写成$USERNAME还继续跑) -
set -o pipefail:让a | b | c中任意环节失败,整个管道返回失败码(否则默认只看c的退出码) - 所有变量引用必须包在双引号里:
"$VAR",不是$VAR,也不是'$VAR'
错误示例:cp $SRC $DST → 正确应为:cp "$SRC" "$DST"。ShellCheck 会报 SC2086,但如果你没开 shellcheck.run 为 onType,就看不到提示。
VSCode 里快速验证环境检查逻辑是否生效
写完骨架别急着填业务代码,先本地验证检查逻辑是否真起作用。VSCode 集成终端(Ctrl+`)就是最直接的测试场,不用反复 chmod +x + ./script.sh。
验证要点:
- 删掉某个依赖命令(如临时重命名
jq),运行脚本看是否立刻报Error: jq is not installed - 用普通用户执行带
[[ $EUID -ne 0 ]]的脚本,确认提示This script must be run as root并退出 - 传空参数进去,比如
./script.sh "",检查[[ -z "$1" ]]分支是否触发
注意:如果终端里执行没反应,先确认右下角语言模式是 Shell Script(不是 Plain Text),否则 Ctrl+` 呼出的终端不会自动 cd 到当前文件所在目录——你可能在错的路径下测试。
自定义模板要避开 .vscode/settings.json 全局污染
如果你习惯把常用检查逻辑(比如统一检查 /proc/sys/net/ipv4/ip_forward 是否开启)做成自己的 snippet,别直接往 .vscode/settings.json 里硬塞 shellman.snippets 配置。那会导致整个工作区所有 .sh 文件都加载该模板,干扰协作和 CI 流水线。
更安全的做法是:
- 把自定义 snippet 存为单独 JSON 文件,比如
~/.vscode/snippets/shell-checks.code-snippets - 在该文件中用
"scope": "shellscript"限定作用域 - 每个 snippet 的
prefix取明确名称,如check_ip_forward,避免和 Shellman 默认前缀冲突 - VSCode 会自动合并用户级 snippets,无需重启,输入前缀 + Tab 即可触发
真正容易被忽略的是:自定义 snippet 里的换行和缩进必须用真实制表符或空格,不能靠 VSCode 自动对齐——否则粘贴出来格式错乱,set -euo pipefail 可能被缩进到 if 块里,变成无效语句。











