Создание пакетного файла для запуска cygwin и выполнения определенной команды

Я хочу создать пакетный файл, который запускает cygwin и выполняет определенную команду (команда предназначена для чтения файла bash и выполнения некоторой команды внутри него).

Это пакетный файл, который я разработал, он работает до некоторой степени. терминал cygwin открывается и пытается прочитать файл bash, но не может выполнить команды внутри:

@ECHO OFF

C:\cygwin64\bin\mintty.exe -li /cygdrive/c/(path-to-bash-file-location)/(MyBashFile)

PAUSE

Как я могу заставить это работать?


person manifertal    schedule 07.04.2017    source источник
comment
Какое конкретное сообщение об ошибке вы получаете от cygwin?   -  person XouDo    schedule 18.05.2021


Ответы (2)


Из вашего пакетного файла запустите оболочку Cygwin bash и используйте флаг входа в систему. Это обеспечивает основу для установки переменных пути и среды через файлы .bash_profile или .bashrc. Я считаю, что это может быть источником ваших трудностей.

@ echo off
C:\cygwin64\bin\bash --login -c "cd ~/path/to/desired; ./mybashfile.sh"

Если вы предоставите более подробную информацию о характере вашего файла bash, я могу быть более конкретным. Удачи.

person Patrick Kelly    schedule 08.04.2017
comment
Большое спасибо, подсказка о флаге --login была очень полезной. - person manifertal; 14.04.2017

Полезный ответ Патрика Келли указывает, что не запускает bash как логин< /em> shell в Cygwin может быть источником проблемы.

Действительно: Всегда запускайте Cygwin bash как оболочку для логина, поскольку в противном случае важные инициализации не будут выполняться; в частности, переменная $PATH не будет содержать /usr/local/bin:/usr/bin, и локаль не будет установлена ​​правильно.

Чтобы bash запускал оболочку login, исполняемому файлу bash необходимо передать параметр -l (или его более длинный псевдоним, --login).

  • Чтобы выполнить ваш скрипт:

    • в текущем окне консоли см. ответ Патрика.

      • Обратите внимание, что если целевой сценарий не зависит от определенного рабочего каталога, использование -c с отдельными командами cd и выполнения не является строго обязательным; что-то вроде следующего будет делать:

        C:\cygwin64\bin\bash -l c:\path\to\your\script
        
    • в mintty.exe терминальное приложение, которое поставляется с Cygwin (как вы пробовали):

      C:\cygwin64\bin\mintty /bin/bash -l c:\path\to\your\script
      
      • Note that executing mintty from a Command Prompt or batch file invariably opens a new console window, and does so asynchronously.

Обратите внимание, что путь в стиле Windows можно (альтернативно) использовать для указания целевого скрипта (что означает, что вы могли бы также использовать c:\cygwin64\bin\bash вместо /bin/bash).

Что еще более важно, обратите внимание, что в обоих случаях требуется явная ссылка на исполняемый файл bash, что контрастирует с то, что вы пробовали:


Параметры, которые вы передаете в mintty.exe, относятся только к it — они не передаются в bash. В частности, вы используете mintty.exe параметры ( увидеть их все, запустив mintty --help):

  • -l, --log FILE|- ... Вывод журнала в файл или стандартный вывод
  • -i, --icon FILE[,IX] ... Загрузить значок окна из файла, опционально с индексом

Таким образом, -li создает файл журнала с именем i в текущем каталоге, поскольку i интерпретируется как параметр-аргумент l, а не как отдельная опция i.

Однако указанный скрипт (/cygdrive/c/...) по-прежнему выполняется, но, что особенно важно, не в оболочке входа.

То, что вы хотели сделать, требует явного вызова исполняемого файла bash, как показано выше, чтобы параметры интерпретировались Bash:

C:\cygwin64\bin\mintty /bin/bash -li c:\path\to\your\script

Кроме того, как уже отмечалось, выполнение mintty.exe из пакетного файла неизменно создает новое окно консоли и делает это асинхронно, то есть ваш пакетный файл немедленно переходит к команде PAUSE, независимо от того, завершен процесс mintty.exe или нет.

Очевидно, что все, что выводится в этом новом окне, не будет видно в исходном окне.


Необязательное чтение: взаимодействие с окном mintty.exe:

Предупреждение: mintty.exe запускается асинхронно даже при использовании обычного start /wait подхода из пакетного файла; то есть следующая попытка заблокировать пакетный файл или командную строку до тех пор, пока mintty.exe не завершится, не работает:

start /wait "" "c:\cygwin64\bin\mintty" # !! DOES NOT WORK - still asynchronous

При передаче скрипта/команды сеанс Bash, созданный mintty.exe, неизменно будет завершаться при завершении скрипта, потому что bash — даже при передаче -i для указания интерактивного сессия - в этом случае произойдет автоматический выход.

Если все, что вам нужно, это проверить вывод после завершения скрипта, запустите:

c:\cygwin64\bin\mintty -h always /bin/bash -l /cygdrive/c/path/to/bash-script

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

Чтобы оболочка оставалась открытой, вам нужен обходной путь:

c:\cygwin64\bin\mintty /bin/bash -lc "/cygdrive/c/path/to/bash-script; exec /bin/bash"

Обратите внимание, что после завершения сценария создается новый экземпляр оболочки.

person mklement0    schedule 08.04.2017