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