Сценарий оболочки PowerShell, выполняющий автоматическое закрытие окна: Start-Process vs ./ - PullRequest
0 голосов
/ 20 октября 2018

Скажем, у меня есть скрипт оболочки с именем myscript.sh в текущем каталоге.

И Start-Process myscript.sh, и ./myscript.sh будут запускать скрипт в новом окне bash, но с одним существенным отличием в поведении:

, если я выберу ./myscript.sh после завершения сценария, окно автоматически закроется, и у меня не будет возможности увидеть вывод, тогда как Start-Process не закроет новое окно.

IИнтересно, почему, и если есть способ изменить это, так как ./ в конечном итоге короче и сложнее для вызова, чем Start-Process.

Редактировать: Ниже bash открывается PS после запуска скрипта.Я считаю, что это мерзавец? введите описание изображения здесь

Редактировать: Вопрос решен, или на самом деле все прошло само собой ...

1 Ответ

0 голосов
/ 22 октября 2018

PowerShell не может сам выполнять .sh сценарии, поэтому он использует системную оболочку графического интерфейса (так называемая оболочка Windows ), чтобы сообщать, как открывать такие файлы.

ВашПохоже, что система настроена на открытие (выполнение) таких файлов с помощью Git Bash , версии Bash, которая поставляется с установкой Git в Windows .

Однакобыть нет разницы между вызовом ./myscript.sh или Start-Process ./myscript.sh: оба должны асинхронно запустить скрипт с Bash в новом окне , а именно в окне консоли MINGW64.

Обратите внимание, что единственный способ запустить такие скрипты - это отдельное окно, потому что Bash, который поставляется с Git, не может работать в обычных консольных окнах.
Как правило, любой файл, расширение которого не указано в $env:PATHEXT как непосредственно исполняемый файл будет запускаться в новом (возможно, графическом) окне.

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

Чтобы предотвратить автоматическое закрытие окна, вы можете следить за выполнением скрипта командой, которая ожидает нажатия клавиши;Например:

& $env:ProgramFiles\Git\git-bash.exe -c './myscript.sh; read -n 1 -p \"Press a key to exit.\"'

Это все равно приводит к асинхронному выполнению;чтобы получить синхронное выполнение, т. е. чтобы дождаться закрытия окна Bash, вы должны объединить вышеприведенное с Start-Process -Wait:

Start-Process -Wait $env:ProgramFiles\Git\git-bash.exe -Args '-c', './myscript.sh; read -n 1 -p \"Press a key to exit.\"'
...