Выполнение скрипта в MSYS2/MinGW

В Windows, если я запускаю c:\msys64\mingw64.exe, открывается оболочка, в которой я могу собрать свой проект, скажем, вызвав bash-скрипт release (для упрощения). Все работает нормально.

Теперь я хотел бы выполнить свой release скрипт на mingw64 напрямую, без взаимодействия.

Я старался:

c:\msys64\mingw64.exe /c/the/full/path/release

Окно открывается и закрывается, не работает.

Я попытался использовать bash напрямую, но, похоже, среда настроена неправильно:

> c:\msys64\usr\bin\bash -c ls
/usr/bin/bash: ls: command not found

> c:\msys64\usr\bin\bash -c /bin/ls
... it works ...

Таким образом, очевидно, что среда не такая, как при выполнении c:\msys64\mingw64.exe, а затем вызове ls.

Как выполнить мой скрипт release, как если бы я был в оболочке, запущенной mingw64.exe?


person rom1v    schedule 22.11.2017    source источник
comment
Попробуйте это: msys2_shell.cmd -mingw64 -c "help |more"   -  person KonstantinL    schedule 22.11.2017
comment
@KonstantinL это помогает, я могу выполнить свой скрипт, но 1) среда все еще не та (например, он не находит мезон, хотя находит его в оболочке mingw64) и 2) он открывает новое окно.   -  person rom1v    schedule 22.11.2017
comment
Я уже опубликовал свой ответ, но мне хотелось бы получить некоторые разъяснения по поводу вашей жалобы на новое окно. Вы хотите, чтобы какое-либо окно появлялось вообще? Что произойдет, если в вашем скрипте есть ошибка, и вы хотите узнать, в чем она заключается?   -  person David Grayson    schedule 23.11.2017
comment
@DavidGrayson Спасибо за ваш длинный ответ, я внимательно его прочитаю. Что касается отсутствия окна, я хотел бы выполнить скрипт из другой программы (например, jenkins) и программно получить его вывод (как я сделал бы с любым собственным скриптом, не использующим msys2).   -  person rom1v    schedule 23.11.2017
comment
Вы не упомянули об этом в своем вопросе. Команда для запуска из Jenkins, вероятно, будет примерно такой же, как в моем ответе, за исключением того, что вы удаляете все до /bin/env и заменяете /bin/env абсолютным путем в стиле Windows к той же программе. Запуск mintty, вероятно, не позволит вам получить вывод.   -  person David Grayson    schedule 23.11.2017
comment
Вы правы, мой вопрос был недостаточно ясен. Я хотел дать только минимальную информацию, чтобы избежать многих не относящихся к делу подробностей. Большое спасибо!   -  person rom1v    schedule 23.11.2017


Ответы (2)


Чтобы запустить сценарий оболочки Bash в MSYS2 без отображения окна, вы должны щелкнуть правой кнопкой мыши на рабочем столе или в другом месте в проводнике Windows, выбрать «Создать», выбрать «Ярлык», а затем ввести что-то вроде этого для цели ярлыка:

C:\msys64\usr\bin\mintty.exe -w hide /bin/env MSYSTEM=MINGW64 /bin/bash -l /c/Users/rom1v/project/release.sh

Обратите внимание, что здесь есть 4 пути. Пути к mintty и release.sh являются абсолютными путями, которые вам нужно будет настроить. Пути к env и bash относятся к каталогу установки MSYS2. Также обратите внимание, что первый путь должен быть стандартным путем Windows, поскольку Windows ожидает его при запуске ярлыка.

Объяснение

Может показаться странным использовать MinTTY для неинтерактивного сценария, но нам нужно использовать какую-то программу, скомпилированную для подсистемы Windows (опция -mwindows для GCC), иначе Windows автоматически запустит новый консоль, когда мы запускаем программу. Мы передаем параметр -w hide в MinTTY, чтобы указать ему не показывать окно. Все после этой опции интерпретируется MinTTY как команда для запуска.

Таким образом, MinTTY запустит /bin/env из дистрибутива MSYS2 и передаст ему остальные аргументы. Это удобная утилита, которая на самом деле является стандартной частью Linux, а также MSYS2. Он устанавливает для переменной среды MSYSTEM значение MINGW64 (что важно позже), а затем запускает /bin/bash с остальными аргументами командной строки.

Мы передаем -l в Bash, чтобы он действовал как сценарий входа и запускал определенные сценарии запуска. В частности, сценарий /etc/profile из MSYS2 важен, потому что он просматривает переменную среды MSYSTEM, видит, что это MINGW64, а затем устанавливает набор других переменных среды (например, PATH), чтобы предоставить вам 64-битную среду оболочки MinGW.

Наконец, мы передаем имя вашего скрипта в качестве основного аргумента bash, поэтому он запустит этот скрипт после запуска скриптов инициализации.

Обработка ошибок

Обратите внимание, что если в вашем сценарии Bash есть ошибка, вы не получите никакого уведомления, потому что приведенный выше ярлык не открывает никаких окон консоли. Лично меня это бы очень раздражало. Я бы, вероятно, удалил параметр -w hide, а затем сделал сценарий bash-оболочки, который просто делает что-то вроде:

run_my_main_script || sleep 10000

Поэтому, если основной скрипт выполнен успешно, немедленно выйдите, в противном случае держите окно открытым в течение 10000 секунд. Вам даже не нужно помещать этот сценарий-оболочку в отдельный файл, вы можете просто поместить его в ярлык в качестве аргумента для параметра Bash -c (не забудьте заключить его в двойные кавычки).

person David Grayson    schedule 23.11.2017
comment
Обратите внимание, что -w hide по-прежнему расфокусирует текущее окно, по крайней мере, в моем случае. Я все еще ищу решение, чтобы предотвратить это, чтобы он мог сосредоточиться на своей текущей программе. - person Menno van Leeuwen; 27.04.2020

Благодаря ответам @David Grayson мне удалось вызвать мой release скрипт с помощью msys2/mingw из консоли Windows (cmd) с дополнительными каталогами (для Java и Meson) в $PATH:

c:\msys64\usr\bin\env MSYSTEM=MINGW64 c:\msys64\usr\bin\bash -l -c "PATH=\"/c/Program Files/Java/jdk1.8.X_XXX/bin:/c/Program Files/Meson:$PATH\" /c/Users/rom1v/project/release"
person rom1v    schedule 23.11.2017