Полезный ответ Патрика Келли указывает, что не запускает bash
как логин< /em> shell в Cygwin может быть источником проблемы.
Действительно: Всегда запускайте Cygwin bash
как оболочку для логина, поскольку в противном случае важные инициализации не будут выполняться; в частности, переменная $PATH
не будет содержать /usr/local/bin:/usr/bin
, и локаль не будет установлена правильно.
Чтобы bash
запускал оболочку login, исполняемому файлу bash необходимо передать параметр -l
(или его более длинный псевдоним, --login
).
Обратите внимание, что путь в стиле 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