From 8660860495d55c02f6082d98c2fa361c588e64e6 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 29 Oct 2026 12:03:02 +0800 Subject: [PATCH] =?UTF-8?q?build.sh=20=E4=B8=A4=E5=A4=84=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=89=93=E7=A3=A8=20#18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) 页码那行改为原样输出。原先用正则截断到 "page",把结尾的括号吃掉了, 打出来是 "1 page" 而不是 "(1 page).",看着像少字符。 2) 临时文件改用 ./.build_out.$$ + trap 清理,不再用 mktemp。mktemp 在 Windows 的 Git Bash 里返回 /tmp/... 形式,随后的 rm 会触发安全检查 (SAFE_DELETE_INVALID_PATH: embedded drive prefix is not allowed), 无害但会往输出里插一行噪音。 3) 取回成功后打印的路径转成 Windows 形式(D:/...),不再显示 Git Bash 的挂载路径(/d/...)。 --- build.sh | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/build.sh b/build.sh index 260bfe9..8c10f66 100755 --- a/build.sh +++ b/build.sh @@ -69,29 +69,36 @@ if [ -z "$TEX" ]; then fi echo "=== WSL 编译: $DIR/$TEX ===" -TMPLOG="$(mktemp)" +# 编译输出先落到临时文件,失败时才好把 ! 开头的行捞出来给人看。 +# 用当前目录下的隐藏文件名,不用 mktemp —— mktemp 在 Windows 的 Git Bash +# 里返回 /tmp/... 形式,与其后的 rm 组合会触发安全检查(safe-delete), +# 属于无害噪音但会干扰输出。 +TMPLOG="./.build_out.$$" +trap 'rm -f "$TMPLOG" 2>/dev/null || :' EXIT INT TERM $SSH "cd '$WSL_ROOT/$DIR' && $TEXBIN -interaction=nonstopmode -halt-on-error '$TEX'" > "$TMPLOG" 2>&1 rc=$? LOG="${TEX%.tex}.log" echo "=== 结论 ===" +# 页码那一行原样输出(含 "pages." 结尾),不要用正则截断 —— +# 截了会把括号吃掉,看起来像 "1 page" 少个字符。 $SSH "cd '$WSL_ROOT/$DIR' && \ printf 'error: %s\n' \"\$(grep -c '^!' '$LOG' 2>/dev/null || :)\"; \ printf 'Overfull: %s\n' \"\$(grep -c 'Overfull' '$LOG' 2>/dev/null || :)\"; \ printf 'Underfull: %s\n' \"\$(grep -c 'Underfull' '$LOG' 2>/dev/null || :)\"; \ - grep -oE 'Output written on .*\([0-9]+ page' '$LOG' 2>/dev/null | tail -1" + grep 'Output written on' '$LOG' 2>/dev/null | tail -1" if [ "$rc" -ne 0 ]; then echo "编译失败,日志片段:" >&2 - grep -A6 "^!" "$TMPLOG" | head -20 | sed 's/^/ /' >&2 - rm -f "$TMPLOG" + grep -A6 "^!" "$TMPLOG" 2>/dev/null | head -20 | sed 's/^/ /' >&2 exit $rc fi -rm -f "$TMPLOG" PDF="${TEX%.tex}.pdf" -if scp -i "$WSL_KEY" -q "$WSL_HOST:$WSL_ROOT/$DIR/$PDF" "$WIN_ROOT/$DIR/$PDF"; then - echo "PDF 已取回: $WIN_ROOT/$DIR/$PDF" +# 打印用户熟悉的 Windows 路径形式,而不是 Git Bash 的 /d/... 挂载路径 +WINPDF="$WIN_ROOT/$DIR/$PDF" +if scp -i "$WSL_KEY" -q "$WSL_HOST:$WSL_ROOT/$DIR/$PDF" "$WINPDF"; then + echo "PDF 已取回: $(echo "$WINPDF" | sed 's|^/\([a-zA-Z]\)/|\U\1:/|')" else echo "PDF 取回失败" >&2; exit 1 fi \ No newline at end of file