我在运行带有 WSL1 的 Ubuntu,我想在 Windows 中创建不同的快捷方式以在 WSL 启动时运行不同的命令,例如,一个用于自动启动 SSH 会话,另一个用于更改到特定目录。执行启动命令后,我需要它像往常一样继续运行,但我尝试过的所有方法都会关闭终端。我尝试过类似
c:\windows\system32\bash.exe -c -i -s ssh ip
但它似乎什么也没做,或者如果它做了,它关闭得太快了,我看不见。
答案1
首先,我建议你使用较新的(微软推荐的)wsl.exe
命令,而不是bash.exe
。 bash.exe
仍然可用,但微软称其为已被“替换”的“历史命令” 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
另一方面,该命令做允许直接调用而不使用引号。它基本上足够智能,可以将命令行的其余部分(在处理完所有参数/标志之后)传递到默认 shell 中,并引用到参数中-c
。您可以在上面看到一个带有 的示例wsl ssh ip
。
接下来,您需要了解如何在运行命令后保持选项卡/shell 打开。这可以通过多种方式实现,但最简单的方法是:
- 启动 shell
- 运行第一个命令
exec
可继续运行的替换外壳
正如您所体验到的,只需执行前两个操作就会导致 shell 在命令退出时关闭。
这看起来像这样:
wsl -e bash -c "ls; exec bash"
答案2
C:\Windows\System32\cmd.exe /k wsl /path/to/script.sh
/k 开关使 cmd 不退出,以便您可以读取输出。wsl 没有类似的开关。