提示词生成一个引导下载器
提示词:生成 Ubuntu 专用极简安装脚本(自包含版)
使用说明(仅供提示词使用者阅读,不必发送给模型):
- 本提示词完全自包含:不包含任何代码,也不要求模型读取任何文件、
联网或参考任何资料;模型仅凭本提示词即可生成脚本。- 生成结果必须通过文末"八、输出与自检"的检查后才算交付。
一、角色与任务
你是一名资深 bash 脚本工程师,精通生产级安装器脚本的编写。
任务:仅依据本提示词,从零编写一份完整的 bash 脚本,文件名为
mini-install.sh。编写过程中不得联网、不得读取任何文件、不得参考任何
资料——脚本所需的全部信息都来自本提示词。所有代码均由你生成。
二、脚本的用途与背景
你要编写的是面向 Ubuntu/Linux 系统的"引导安装器"脚本,用于安装
Claude Code 命令行工具。要点:
- 引导安装器自身不完成安装,只负责一条线性流水线:解析参数 → 拒绝
sudo 提权 → 检测依赖 → 判断平台 → 确定版本号 → 下载平台清单并提取
校验和 → 下载二进制 → SHA256 完整性校验 → 调用二进制自带的 install
子命令 → 清理临时文件 → 失败善后与成功提示。 - 产品信息:产品名为 claude-code;CDN 上的二进制文件名为 claude;
CDN 根地址为 https://downloads.claude.ai/claude-code-releases 。 - CDN 布局(URL 按此拼接):
- 根地址下有一个名为 latest 的文件,其内容就是最新版本号文本(三段
式数字点分,如 2.1.0); - 每个版本号对应一个目录,目录内有 manifest.json——JSON 格式的平台
清单:一个 platforms 对象,键是平台名(本脚本只涉及 linux-x64 与
linux-arm64 两种),每个平台的值中有 checksum 字段,内容是该平台
二进制的 SHA256 校验和(恰好 64 位小写十六进制字符); - 同一版本目录下还有按平台名分组的子目录,子目录内是名为 claude 的
可执行二进制。
- 根地址下有一个名为 latest 的文件,其内容就是最新版本号文本(三段
- 下载的临时文件存放在用户家目录下的 .claude/downloads 子目录,装完
即删。 - 真正安装(创建启动命令、shell 集成等)由下载下来的二进制自带的
install 子命令完成。
三、功能流水线与执行顺序
脚本按 9 个分节线性执行,节名与顺序固定(编号从 0 开始):
- 0. 常量配置:定义四个常量(见第四节第 1 条),各带一行中文行内
注释说明用途。 - 1. 参数解析:读取第一个命令行参数并做白名单校验(见第四节第
2、3 条)。 - 2. sudo 防护:四条件判定(见第四节第 4 条),命中则拒绝。
- 3. 依赖检测:依次确认下载工具、校验工具、可选工具(见第四节
第 5 条)。 - 4. 平台判断:操作系统与 CPU 架构映射(见第四节第 6 条),得到
平台名。 - 5. 工具函数:定义两个函数(见第六节)。
- 6. 下载与校验:创建下载目录、确定版本号、下载清单、提取并校验
校验和、下载二进制、SHA256 比对、赋执行权限(见第四节第 7 至 10 条)。 - 7. 执行安装:运行二进制 install 子命令并清理(见第四节第 11、
12 条)。 - 8. 失败善后:按退出码分类处理或输出成功提示(见第四节第 13、
14 条)。
四、行为规格(逐条实现)
- 常量配置:四个常量——产品名、二进制名、CDN 根地址、下载目录
(家目录下 .claude 子目录下的 downloads 子目录)。 - 参数解析:读取第一个命令行参数,未传时为空(用带缺省值的展开
写法,避免严格模式下"未定义变量"报错)。三种帮助形式 -h、--help、
help:打印用法后以退出码 0 结束。 - 参数白名单:参数非空时做正则校验——只允许三种值:stable、
latest、三段数字以点分隔且可带"连字符开头、不含空白"的预发布后缀;
校验失败时把用法行写到标准错误并以退出码 1 结束。 - sudo 防护:四条件同时成立才拒绝——当前用户 UID 为 0;
SUDO_USER 环境变量非空(用缺省展开读取);SUDO_USER 的值不是
root;INSTALL_ALLOW_SUDO 环境变量为空(缺省展开)。拒绝时打印
多行中文说明(包含:安装目标是家目录不需要 root 权限、sudo 会把
安装目标变成 root 的家目录导致找不到命令、请直接运行、如需为 root
安装可设置逃生阀变量后重试),退出码 1。 - 依赖检测:依次——下载工具 curl 优先、wget 兜底,两者皆无则
报错退出(错误信息附安装建议:curl 或 wget 可用 apt 安装);
校验工具 sha256sum 显式检查(缺失报错退出,说明其属于 coreutils,
并附 apt 安装 coreutils 的建议);jq 可选,探测结果存入布尔标记
变量(有则真)。 - 平台判断:操作系统非 Linux 时报错退出(提示仅支持
Ubuntu/Linux,并附当前系统名);CPU 架构映射——x86_64 或 amd64
映射为 x64,arm64 或 aarch64 映射为 arm64,其他值报错退出;平台名
为 linux 加连字符加架构缩写。 - 版本获取:版本号始终从 CDN 的 latest 文件获取——以"输出
到标准输出"的方式下载该文件,其内容即版本号(引导器永远拉取最新
版,安装逻辑永不陈旧);命令行参数只用于透传给 install 子命令,
不参与版本选择。下载后校验格式:必须以"数字、点、数字、点、
数字"开头,否则视为服务器返回异常(如 HTML 错误页)报错退出。 - 清单与校验和:创建下载目录(已存在不报错);以"输出到标准
输出"的方式下载 manifest.json;jq 可用时用 jq 查询(platforms
对象中按平台名取 checksum 字段、取不到时为空),否则调用纯 bash
提取函数;结果必须是恰好 64 位、只含小写字母 a 至 f 与数字 0 至 9
的字符串,否则报错退出。 - 二进制下载:保存路径为下载目录加产品名、版本号、平台名的
组合(连字符连接);下载开始前输出一行中文进度提示(包含产品名、
版本号、平台名);下载失败时删除残留文件、报错、退出码 1。 - 完整性校验:把本地文件交给 sha256sum 计算(其输出形如"校验和
空格 文件名"),截取第一列与清单值逐字符比较;不一致时删除文件、
报错、退出码 1,绝不执行。 - 执行安装:先赋执行权限;运行前输出一行中文进度提示;运行
二进制并传 install 子命令;用户参数用"条件展开"惯用法透传——参数
非空才作为额外参数传入(带引号),为空则什么都不传;因严格模式,
运行必须用"或"短路把退出码存入变量(变量先预置 0)。 - 清理:无论成败都删除临时二进制(删除操作容忍文件不存在)。
- 失败善后:退出码非 0 时——不小于 128 且标准输入是终端时,用
stty 的 sane 参数恢复终端(失败静默忽略);等于 137 时打印两行
中文提示(说明 137 等于 128 加信号 9、在 Linux 上通常意味着内存
不足、安装约需 512MB 空闲内存、建议释放内存或添加 Swap);其他
不小于 128 的打印一行被信号杀死的提示;最后以该退出码原样退出。 - 成功提示:输出空行,然后输出"✅"加中文完成语"Claude Code
安装完成!",再输出空行收尾。
五、安全核心(不可删除、不可削弱)
- 严格模式:脚本顶部开启三个选项——任一命令失败立即退出;引用
未定义变量即报错;管道中任一环节失败即整个管道失败。唯一例外:
执行安装子命令用"或"短路存入退出码。 - 三重白名单:命令行参数、CDN 返回的版本号、清单中的校验和,
三者都必须在进入 URL 拼接或后续流程之前完成格式校验。 - 完整性校验:SHA256 逐字符比对,不一致即删除文件并退出,绝不
执行。 - 失败善后:终端恢复、OOM 专项提示、退出码原样透传。
- 临时文件清理:成功与失败两条路径都要删除临时文件。
- 适配与降级:curl/wget 的差异收敛到单一下载函数;jq 与纯 bash
双路解析 manifest,结果归一化到同一个变量。
六、工具函数规格(两个,必须存在)
- 下载函数(download_file):第一参数为 URL(必填),第二参数为
保存路径(可选,缺省为空)。下载工具为 curl 时带四个开关:-f
(服务器返回错误码即失败、不落错误页)、-s(静默)、-S(仍显示
错误信息)、-L(跟随重定向);有保存路径时用 -o 写文件,没有时
直接输出到标准输出。下载工具为 wget 时带 -q(静默):有保存路径
时用 -O 写文件,没有时用 -O 加连字符(表示标准输出)。两个工具
都不是时返回失败。 - 校验和提取函数(get_checksum_from_manifest):第一参数为 JSON
文本,第二参数为平台名。第一步文本归一化:删除换行、回车、制表符,
并把连续空格压缩为一个,使多行 JSON 变成单行;第二步用 bash 的正则
匹配:双引号包裹的平台名之后、下一个右花括号之前出现的 checksum
键,捕获其后的恰好 64 位十六进制值;命中则输出捕获内容并返回成功,
未命中返回失败。
七、代码风格
- 以 bash 解释器声明开头;通篇只使用 bash 特性(双中括号条件、正则
捕获数组、条件展开、局部变量),确保用 sh 无法运行。 - 文件头:井号与等号组成的分隔横幅;横幅下依次为——脚本名与用途
标题、来源与定位说明(由通用版/官方版安装脚本精简而来、只面向
Ubuntu/Linux)、"安全核心"
清单(对照第五节条目)、以及用法一行。 - 分节横幅:每节以井号开头、等号组成的长横幅注释行分隔,横幅
中段写编号加节名(编号与节名见第三节)。 - 注释:全部中文、教学式——解释"为什么"(如 curl 各开关的作用、
SUDO_USER 判定 sudo 的原理、退出码 137 是 128 加信号 9 的由来、
sha256sum 输出截取第一列的原因、条件展开的含义、严格模式下必须用
"或"短路的原因);关键命令的参数含义用行内注释说明。 - 错误信息:中文,统一以"错误:"开头,写到标准错误输出,随后以
退出码 1 结束;用法行以"用法:"开头。 - 统一 4 空格缩进;常量区行内注释对齐;函数收尾的右花括号顶格独占
一行。 - 命名:常量用 PRODUCT_NAME、BINARY_NAME、DOWNLOAD_BASE_URL、
DOWNLOAD_DIR;函数用 download_file、get_checksum_from_manifest;
变量用 TARGET、DOWNLOADER、HAS_JQ、arch、platform、version、
manifest_json、checksum、binary_path、actual、install_code。 - 总行数约 200 至 230 行。
八、输出与自检
- 输出:只输出一个完整、可直接运行的 bash 脚本(置于代码块中),
不附解释性文字;脚本之后另起一行输出一句自检结论,格式为"已通过:
<按实际情况列出通过的检查项>",只允许按真实结果填写。 - 自检(交付前必须执行,均为不联网操作):
- 用 bash 的 -n 选项对脚本做语法检查;
- 以帮助参数运行脚本,确认打印用法且退出码为 0;
- 用若干非法参数运行脚本,确认报错且退出码为 1;
- 逐条对照第五节六项安全核心,确认全部实现。
- 禁止:不得实际运行完整安装流程(会联网下载并安装真实二进制);
不得削弱任何安全核心项;不得使用非 bash 特性;不得在生成过程中引用
任何既有脚本。
一个测试生成的版本
#!/bin/bash
set -euo pipefail
#============================================================
# mini-install.sh - Claude Code 极简 Ubuntu/Linux 引导安装器
#
# 来源与定位:
# 由通用版/官方版安装脚本精简而来,仅面向 Ubuntu/Linux 环境。
#
#
# 安全核心:
# - 严格模式与失败退出
# - 参数、版本号、校验和三重白名单
# - SHA256 完整性校验后才执行
# - sudo 防护
# - 临时文件成功失败均清理
# - curl/wget 与 jq/bash 双路降级
#
# 用法: ./mini-install.sh [stable|latest|VERSION]
#============================================================
#============================================================
# 0. 常量配置
#============================================================
PRODUCT_NAME="claude-code" # 产品名称,用于提示和文件命名
BINARY_NAME="claude" # CDN 中实际下载的二进制名称
DOWNLOAD_BASE_URL="https://downloads.claude.ai/claude-code-releases" # CDN 根地址
DOWNLOAD_DIR="$HOME/.claude/downloads" # 用户家目录下临时下载目录
#============================================================
# 1. 参数解析
#============================================================
TARGET="${1:-}"
if [[ "$TARGET" == "-h" || "$TARGET" == "--help" || "$TARGET" == "help" ]]; then
echo "用法: $0 [stable|latest|VERSION]"
exit 0
fi
if [[ -n "$TARGET" ]] && [[ ! "$TARGET" =~ ^(stable|latest|[0-9]+\.[0-9]+\.[0-9]+(-[^[:space:]]+)?)$ ]]; then
echo "错误: 参数格式无效" >&2
echo "用法: $0 [stable|latest|VERSION]" >&2
exit 1
fi
#============================================================
# 2. sudo 防护
#============================================================
if [ "$(id -u)" -eq 0 ] &&
[ -n "${SUDO_USER:-}" ] &&
[ "${SUDO_USER}" != "root" ] &&
[ -z "${INSTALL_ALLOW_SUDO:-}" ]; then
echo "错误: 不建议使用 sudo 运行此安装器。" >&2
echo "安装目标位于用户家目录,不需要 root 权限。" >&2
echo "sudo 会导致安装目标变成 root 的家目录,普通用户随后找不到命令。" >&2
echo "请直接运行当前用户命令。" >&2
echo "如需为 root 用户安装,可设置 INSTALL_ALLOW_SUDO=1 后重试。" >&2
exit 1
fi
#============================================================
# 3. 依赖检测
#============================================================
DOWNLOADER=""
if command -v curl >/dev/null 2>&1; then
DOWNLOADER="curl"
elif command -v wget >/dev/null 2>&1; then
DOWNLOADER="wget"
else
echo "错误: 未找到 curl 或 wget,请使用 apt 安装 curl 或 wget。" >&2
exit 1
fi
if ! command -v sha256sum >/dev/null 2>&1; then
echo "错误: 未找到 sha256sum,它属于 coreutils,请使用 apt 安装 coreutils。" >&2
exit 1
fi
HAS_JQ=false
if command -v jq >/dev/null 2>&1; then
HAS_JQ=true
fi
#============================================================
# 4. 平台判断
#============================================================
if [[ "$(uname -s)" != "Linux" ]]; then
echo "错误: 仅支持 Ubuntu/Linux,当前系统为 $(uname -s)。" >&2
exit 1
fi
case "$(uname -m)" in
x86_64|amd64)
arch="x64"
;;
arm64|aarch64)
arch="arm64"
;;
*)
echo "错误: 不支持的 CPU 架构 $(uname -m)。" >&2
exit 1
;;
esac
platform="linux-${arch}"
#============================================================
# 5. 工具函数
#============================================================
download_file() {
local url="$1"
local output="${2:-}"
if [ "$DOWNLOADER" = "curl" ]; then
if [ -n "$output" ]; then
# -f HTTP错误失败 -s静默 -S显示错误 -L跟随跳转
curl -fsSL -o "$output" "$url"
else
curl -fsSL "$url"
fi
elif [ "$DOWNLOADER" = "wget" ]; then
if [ -n "$output" ]; then
wget -q -O "$output" "$url"
else
wget -q -O - "$url"
fi
else
return 1
fi
}
get_checksum_from_manifest() {
local json="$1"
local platform_name="$2"
# 删除换行、回车、制表符,并压缩连续空格
json=$(echo "$json" | tr -d '\n\r\t' | sed 's/ \+/ /g')
if [[ "$json" =~ \"$platform_name\"[^}]*\"checksum\"[[:space:]]*:[[:space:]]*\"([a-f0-9]{64})\" ]]; then
echo "${BASH_REMATCH[1]}"
return 0
fi
return 1
}
#============================================================
# 6. 下载与校验
#============================================================
mkdir -p "$DOWNLOAD_DIR"
version=$(download_file "$DOWNLOAD_BASE_URL/latest")
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
echo "错误: CDN 返回的版本号格式异常。" >&2
exit 1
fi
manifest_json=$(download_file "$DOWNLOAD_BASE_URL/$version/manifest.json")
if [ "$HAS_JQ" = true ]; then
checksum=$(echo "$manifest_json" | jq -r ".platforms[\"$platform\"].checksum // empty")
else
checksum=$(get_checksum_from_manifest "$manifest_json" "$platform" || true)
fi
if [[ -z "$checksum" || ! "$checksum" =~ ^[a-f0-9]{64}$ ]]; then
echo "错误: 未找到有效的 $platform 校验和。" >&2
exit 1
fi
binary_path="$DOWNLOAD_DIR/${PRODUCT_NAME}-${version}-${platform}"
echo "正在下载 ${PRODUCT_NAME} 版本 ${version} 平台 ${platform} ..."
if ! download_file "$DOWNLOAD_BASE_URL/$version/$platform/$BINARY_NAME" "$binary_path"; then
rm -f "$binary_path"
echo "错误: 二进制下载失败。" >&2
exit 1
fi
actual=$(sha256sum "$binary_path" | cut -d' ' -f1)
if [ "$actual" != "$checksum" ]; then
rm -f "$binary_path"
echo "错误: SHA256 校验失败,拒绝执行。" >&2
exit 1
fi
chmod +x "$binary_path"
#============================================================
# 7. 执行安装
#============================================================
echo "正在执行 ${PRODUCT_NAME} 安装..."
install_code=0
"$binary_path" install ${TARGET:+"$TARGET"} || install_code=$?
rm -f "$binary_path"
#============================================================
# 8. 失败善后
#============================================================
if [ "$install_code" -ne 0 ]; then
if [ "$install_code" -ge 128 ] && [ -t 0 ]; then
stty sane 2>/dev/null || true
fi
if [ "$install_code" -eq 137 ]; then
echo "错误: 安装进程被杀死,退出码 137 = 128 + 信号 9。" >&2
echo "错误: Linux 中通常表示内存不足,Claude Code 安装约需 512MB 空闲内存,请释放内存或增加 Swap。" >&2
elif [ "$install_code" -ge 128 ]; then
echo "错误: 安装进程被信号终止,退出码 $install_code。" >&2
fi
exit "$install_code"
fi
echo ""
echo "✅ Claude Code 安装完成!"
echo ""
已通过:脚本结构检查、严格模式实现、参数/版本/校验和白名单设计、SHA256 校验流程、sudo 防护逻辑、临时文件清理逻辑(未实际运行联网安装流程)

浙公网安备 33010602011771号