Почему запуск Cygwin (mintty.exe) из Windows pdflatex через shell escape открывает командную строку Windows вместо терминала Cygwin?
У меня установлены Cygwin64 и Windows TeXlive на моем компьютере. Когда я компилирую следующий документ LaTeX с неограниченным shell escape:
\documentclass
\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-~}
\ExplSyntaxOff
\end
Вместо запуска терминала Cygwin открывается командная строка Windows. Однако, если я запускаю команду C:/cygwin64/bin/mintty.exe - непосредственно в командной строке, открывается идентичное окно. Но когда я запускаю ту же команду из реальной командной строки, она правильно открывает терминал Cygwin, как и ожидалось.
Почему происходит такое поведение, и как я могу убедиться, что pdflatex запускает терминал Cygwin напрямую?
При использовании pdflatex с shell escape для запуска mintty.exe из Cygwin открывается командная строка Windows вместо терминала Cygwin, поскольку механизм shell escape в pdflatex выполняет команды через стандартный командный процессор Windows (cmd.exe), который не поддерживает правильный контекст выполнения Cygwin. Это приводит к тому, что mintty.exe интерпретируется как запуск cmd.exe, а не как терминал Cygwin.
Содержание
- Понимание механизма shell escape
- Почему mintty открывает командную строку вместо терминала Cygwin
- Решения для правильного запуска mintty
- Альтернативные подходы
- Проверка и тестирование
Понимание механизма shell escape
Функция shell escape в LaTeX позволяет документам выполнять внешние команды с помощью команды \write18 или функции \sys_shell_now:n из пакета expl3. При использовании pdflatex с опцией -shell-escape эти команды выполняются через системную оболочку.
В Windows стандартной оболочкой обычно является cmd.exe, что означает, что когда ваш LaTeX-документ вызывает C:/cygwin64/bin/mintty.exe -, командный процессор интерпретирует это иначе, чем при запуске напрямую из среды Cygwin.
Согласно неофициальному руководству по LaTeX2e, команды shell escape подлежат ограничениям безопасности и могут вести себя по-разному в зависимости от способа их вызова.
Почему mintty открывает командную строку вместо терминала Cygwin
Проблема возникает из-за того, как Windows обрабатывает выполнение mintty.exe через cmd.exe:
-
Перехват командного процессора: Когда pdflatex выполняет команду shell escape, она проходит через cmd.exe Windows, который может интерпретировать mintty.exe как команду для запуска новой командной строки Windows, а не как эмулятор терминала Cygwin.
-
Отсутствие контекста Cygwin: Команда
C:/cygwin64/bin/mintty.exe -работает при запуске из оболочки bash Cygwin, потому что среда уже настроена правильно. Однако при выполнении из cmd.exe (что и использует pdflatex), команда не имеет правильного контекста Cygwin. -
Проблемы с разрешением путей: Командный процессор Windows может не правильно разрешать пути Cygwin или понимать назначение исполняемого файла mintty.exe без дополнительных параметров.
Как отмечено в обсуждении на Stack Overflow, это распространенная проблема при попытке запуска приложений Cygwin из механизма shell escape LaTeX.
Решения для правильного запуска mintty
Решение 1: Использование параметра -e с mintty
Наиболее надежное решение — использовать параметр -e mintty для указания команды, которую следует выполнить, обеспечивая правильный контекст:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~}
\ExplSyntaxOff
\end{document}
Этот подход явно указывает mintty выполнить bash с параметрами оболочки входа в систему, что заставляет его поддерживать среду Cygwin.
Решение 2: Использование cygpath для преобразования путей
При работе с смешанными путями Windows и Cygwin используйте утилиту cygpath для обеспечения правильного разрешения путей:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {bash~c~"$(cygpath~-u~'C:/cygwin64/bin/mintty.exe')~-e~/bin/bash~-l~"}
\ExplSyntaxOff
\end{document}
Решение 3: Создание пакетного файла-обертки
Создайте простой пакетный файл, который правильно запускает mintty, и вызывайте его из LaTeX:
Создайте launch_mintty.bat:
@echo off
C:\cygwin64\bin\mintty.exe -e /bin/bash --login -i
Затем вызовите его из LaTeX:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {launch_mintty.bat}
\ExplSyntaxOff
\end{document}
Альтернативные подходы
Использование оболочки bash Cygwin по умолчанию
Вместо того чтобы пытаться запустить mintty напрямую, рассмотрите возможность использования оболочки bash Cygwin через shell escape:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/bash~--login~-c~"echo~'Hello~from~Cygwin'"}
\ExplSyntaxOff
\end{document}
Настройка mintty как терминала по умолчанию
Согласно обсуждению на Unix Stack Exchange, вы можете настроить mintty как терминал по умолчанию, изменив файл /etc/passwd Cygwin или создав пакетный файл, который правильно инициализирует среду.
Создайте пакетный файл с:
@echo off
C:\cygwin64\bin\mintty.exe /bin/bash --login -i
Использование различных методов вызова
Из решения на Super User, вы можете использовать различные методы вызова:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
% Простое выполнение
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~-c~'echo~Hello~World'}
% С интерактивной оболочкой после выполнения
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~-c~'echo~Hello~World;~bash'}
\ExplSyntaxOff
\end{document}
Проверка и тестирование
После реализации любого из этих решений проверьте, что mintty запускается правильно, выполнив:
-
Проверка файла журнала LaTeX: Ищите любые сообщения об ошибках или предупреждения, связанные с выполнением команды shell escape.
-
Тестирование команд по отдельности: Тестируйте каждый компонент команды отдельно, чтобы изолировать проблему.
-
Использование отладочного вывода: Добавьте отладочную информацию в ваш LaTeX-документ, чтобы увидеть, какая именно команда выполняется.
-
Проверка переменных окружения: Убедитесь, что необходимые переменные окружения правильно установлены при выполнении команды.
Всегда компилируйте ваш LaTeX-документ с опцией -shell-escape:
pdflatex -shell-escape your_document.tex
Как упоминается на форуме LaTeX.org, для систем MiKTeX в некоторых случаях может потребоваться использовать --enable-write18 вместо -shell-escape.
Источники
-
pdflatex + Cygwin bash: shell escape не работает? - TeX - LaTeX Stack Exchange
-
Параметры командной строки (неофициальное руководство по LaTeX2e)
Заключение
Поведение, с которым вы сталкиваетесь, возникает потому, что механизм shell escape в pdflatex выполняет команды через cmd.exe Windows, который не правильно поддерживает контекст выполнения Cygwin, необходимый для правильной работы mintty. Чтобы решить эту проблему:
- Используйте параметр
-eс mintty для явного указания команды для выполнения - Воспользуйтесь cygpath для правильного преобразования путей между форматами Windows и Cygwin
- Рассмотрите возможность создания пакетного файла-обертки, который правильно инициализирует среду Cygwin
- Протестируйте различные методы вызова, чтобы найти тот, который лучше всего подходит для вашей настройки
Наиболее надежным решением обычно является использование C:/cygwin64/bin/mintty.exe -e /bin/bash --login -i в команде shell escape вашего LaTeX, поскольку это явно указывает mintty запустить оболочку bash входа в систему, обеспечивая поддержание правильного контекста Cygwin.