从Windows版pdflatex通过shell escape启动mintty.exe时,为何打开的是Windows命令提示符而非Cygwin终端?
从Windows版pdflatex通过shell escape启动mintty.exe时,为何打开的是Windows命令提示符而非Cygwin终端?
这个问题我之前折腾过好一阵才搞明白!核心问题出在Windows TeX Live的shell escape环境和普通cmd的环境完全不一样,导致mintty没法正确加载Cygwin的运行上下文。
先给你理清楚原因
- 你在普通cmd窗口里能正常启动mintty,是因为这个窗口的环境变量(比如PATH)已经包含了Cygwin的
bin目录,而且可能已经加载了Cygwin的初始化配置,mintty能顺利找到Cygwin的bash.exe,自然就能启动Cygwin终端。 - 但Windows版pdflatex通过shell escape执行命令时,会启动一个简化版的cmd进程:它不会加载你系统里配置的全局环境变量(比如你手动加进PATH的Cygwin路径),工作目录也不是Cygwin的根目录(通常是TeX的临时目录或你的TeX文件所在目录)。在这种“残缺”的环境下,mintty找不到Cygwin的bash,就会 fallback 到系统默认的shell——也就是cmd,所以你看到的是和原来一样的命令提示符窗口。
给你几个亲测有效的解决方案
方案一:显式让mintty调用Cygwin的bash
不要直接启动mintty,而是让它明确指定要运行的Cygwin bash,同时让bash以登录shell模式启动(加载完整的Cygwin环境)。把你的LaTeX代码改成这样:
\documentclass{article} \begin{document} \ExplSyntaxOn \sys_shell_now:n {C:/cygwin64/bin/mintty.exe~C:/cygwin64/bin/bash.exe~-l~-} \ExplSyntaxOff \end{document}
这里的-l参数是关键,它会让bash加载Cygwin的初始化脚本,保证所有必要的环境变量都配置到位。
方案二:通过Cygwin bash间接启动mintty
另一种更稳妥的方式是先启动Cygwin的bash,再让bash去启动mintty——这样bash会先把Cygwin的环境变量全部加载好,mintty就能正常工作了:
\documentclass{article} \begin{document} \ExplSyntaxOn \sys_shell_now:n {C:/cygwin64/bin/bash.exe~-c~'exec~mintty.exe~-'} \ExplSyntaxOff \end{document}
这里的exec是为了让bash直接替换成mintty进程,避免留下多余的bash后台进程。
方案三:指定mintty的工作目录为Cygwin根目录
如果你还是想直接启动mintty,可以通过-d参数强制让它以Cygwin的根目录(Windows路径是C:/cygwin64)作为工作目录,这样它就能找到bash了:
\documentclass{article} \begin{document} \ExplSyntaxOn \sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-d~C:/cygwin64~-} \ExplSyntaxOff \end{document}
最后提醒一句
编译的时候一定要记得开unrestricted shell escape——要么在命令行加--shell-escape参数,要么在你的TeX编辑器里设置允许 unrestricted shell escape,不然TeX会直接拦截这些shell命令,根本不会执行。
我当时用方案一就一次性解决了问题,你可以先试试这个,不行再换其他方案~




