build.sh 两处输出打磨 #18

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/...)。
This commit is contained in:
2026-10-29 12:03:02 +08:00
parent ef1bc72603
commit 8660860495
+14 -7
View File
@@ -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