如何使用命令打开 WSL 终端而不使其自动关闭?

如何使用命令打开 WSL 终端而不使其自动关闭?

我在运行带有 WSL1 的 Ubuntu,我想在 Windows 中创建不同的快捷方式以在 WSL 启动时运行不同的命令,例如,一个用于自动启动 SSH 会话,另一个用于更改到特定目录。执行启动命令后,我需要它像往常一样继续运行,但我尝试过的所有方法都会关闭终端。我尝试过类似

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

但它似乎什么也没做,或者如果它做了,它关闭得太快了,我看不见。

答案1

首先,我建议你使用较新的(微软推荐的)wsl.exe命令,而不是bash.exebash.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 没有类似的开关。

相关内容