Как открыть терминал WSL с помощью команды, не закрывая его автоматически?

Как открыть терминал WSL с помощью команды, не закрывая его автоматически?

Я использую Ubuntu с WSL1 и хочу сделать разные ярлыки в Windows для запуска разных команд при запуске WSL, например, один для автоматического запуска сеанса SSH, другой для перехода в определенный каталог. После выполнения команды запуска мне нужно, чтобы она продолжала работать как обычно, но все, что я пробовал, закрывало терминал. Я пробовал что-то вроде

c:\windows\system32\bash.exe -c -i -s ssh ip

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

решение1

Во-первых, я порекомендую вам использовать более новую (рекомендуемую Microsoft) wsl.exeкоманду вместо bash.exe. bash.exeвсе еще доступна, но Microsoft называет ее «исторической командой», которая была «заменена» wsl.exe. wslКоманда также предоставляет гораздо больше опций, чем старая bash.exe.

Первая проблема, с которой вы сталкиваетесь, заключается в том, что в вашей командной строке есть ошибка синтаксиса/цитирования, поэтому да, вкладка Windows Terminal закрывается до того, как вы сможете ее прочитать. Лучше всего сначала запустить это из профиля/вкладки PowerShell или CMD, чтобы увидеть вывод:

PS> bash.exe -c -i -s ssh ip
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]
PS> bash.exe -c "ssh ip"
user@ip's password:
PS> wsl ssh ip
user@ip's password:
PS> wsl -e bash -c ssh ip
<displays usage information as above>
PS> wsl -e bash -c "ssh ip"
user@ip's password:

Как вы видите, если вы передаете строку команды в bash -c, ее нужно заключить в кавычки. В противном случае bash просто видит sshбез ip.

wslС другой стороны, командаделаетразрешить вызов напрямую без кавычек. По сути, это достаточно умно, чтобы передать остаток командной строки (после обработки всех аргументов/флагов) в оболочку по умолчанию, заключенную в кавычки для аргумента -c. Вы можете увидеть пример этого выше с wsl ssh ip.

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

  • Начать оболочку
  • Выполните первую команду
  • execсменная оболочка, которая будет продолжать работать

Как вы уже знаете, выполнение первых двух из этих пунктов приведет к закрытию оболочки после завершения команды.

Это будет выглядеть примерно так:

wsl -e bash -c "ls; exec bash"

решение2

C:\Windows\System32\cmd.exe /k wsl /path/to/script.sh

Ключ /k отключает выход из cmd, чтобы вы могли прочитать вывод. У wsl подобного ключа нет.

Связанный контент