fix(deploy): .env 中带空格的值未加引号导致 install.sh 以 127 失败

现象:
  ./deploy/.env: line 53: Miku.pmx: command not found
  [install] 第 53 行执行失败(退出码 127)

根因:deploy/.env.example 的 MODEL_CONVERT_PMX=Hatsune Miku.pmx 值含空格
却没加引号,install.sh 用 `set -a; . deploy/.env` 载入时被切成
「赋值 + 命令」,Miku.pmx 被当成命令执行。

修复:
1. 模板改为 MODEL_CONVERT_PMX="Hatsune Miku.pmx"(占位符值同样加引号);
2. 新增 deploy/env-lib.sh:.env 语法预检,install.sh / ctl.sh 在 source
   之前检查,报错给出「哪一行 / 原文 / 改法」, 与反引号建议单引号;
3. install.sh 的 ERR trap 补上出错文件名(lineno 属于被 source 的 .env,
   只报行号无法定位);
4. 新增 test/env-file.spec.ts 12 项回归测试,锁住「模板可被 shell 原样载入」;
5. 版本升到 0.2.1,README(.md/.txt)/DSH.md 补 .env 写法约定、FAQ 与测试数量。
This commit is contained in:
opendance
2026-09-15 22:26:58 +08:00
parent d6376ec5a5
commit ea58520fc2
14 changed files with 412 additions and 33 deletions
+11 -1
View File
@@ -21,11 +21,18 @@
# ============================================================
set -euo pipefail
# 失败时打印出错行号,避免只看到半截输出
trap 'printf "\033[1;31m[install]\033[0m 第 %d 行执行失败(退出码 %d)\n" "$LINENO" "$?" >&2' ERR
trap 'printf "\033[1;31m[install]\033[0m %s 第 %d 行执行失败(退出码 %d)\n" "${BASH_SOURCE[0]}" "$LINENO" "$?" >&2' ERR
SRC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$SRC_DIR"
# .env 语法预检(deploy/env-lib.sh):.env 是被 shell 真正 source 的文件,
# 未加引号且含空格的值会被当成命令执行,报错形如
# ./deploy/.env: line 53: Miku.pmx: command not found
# 载入前先查一遍,给出带行号与改法的中文提示。
# shellcheck source=deploy/env-lib.sh
. "$SRC_DIR/deploy/env-lib.sh"
APP_DIR="${APP_DIR:-/opt/opendance}"
SERVICE_USER="${SERVICE_USER:-opendance}"
STORAGE_DIR="${STORAGE_DIR:-/var/lib/opendance/storage}"
@@ -125,6 +132,8 @@ if [ ! -f deploy/.env ]; then
fi
fi
opendance_validate_env_file "./deploy/.env" || die "deploy/.env 语法预检未通过(见上):按提示给对应行的值加上引号后重新执行。"
set -a
# shellcheck disable=SC1091
. ./deploy/.env
@@ -320,6 +329,7 @@ fi
# ---------- 3. 数据库迁移 ----------
log "执行 TypeORM 迁移(不使用 DB_SYNCHRONIZE)"
opendance_validate_env_file "$APP_DIR/deploy/.env" || die "$APP_DIR/deploy/.env 语法预检未通过(见上)"
set -a; . "$APP_DIR/deploy/.env"; set +a
cd "$APP_DIR/web-server"
as_service_user env \