Я использую 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 подобного ключа нет.