【问题标题】:How to launch a new WSL bash window from an existing WSL bash window如何从现有的 WSL bash 窗口启动新的 WSL bash 窗口
【发布时间】:2019-09-14 11:27:34
【问题描述】:

我正在努力弄清楚如何通过 WSL 中的 bash 命令启动新的“命令提示符”窗口。目标是最好已经在 bash 中启动第二个提示。

我已经尝试过运行 cmd.exe 但这只会让我在 bash shell 中使用标准的 Windows 命令提示符 cmd。
https://i.imgur.com/tIdRMvR.png

运行 bash.exewsl.exe 命令只会将我从同一个 bash shell 中转到另一个 bash shell。
https://i.imgur.com/OM1XTlG.png

我正在使用 WSL 的 Debian 发行版,不过这并不重要。

我知道您可以通过将start 命令放在程序前面来从标准命令提示符创建一个新窗口。但是我找不到 *nix 等效项或如何从 WSL 中调用执行相同操作的 bash 命令。

【问题讨论】:

  • cmd.exe /c start bash,但这个问题不在此处讨论。
  • 此外,清晰的概念会导致语言不那么扭曲。您正在新控制台中启动 bash。 “命令提示符”是一个奇怪的表达方式。有时人们用它来指代控制台,有时他们用它来指代 CMD shell。它们不是同一个东西,所以人们永远不清楚人们的意思,甚至他们是否明白他们不是同一个东西。
  • 上述命令运行 C​​MD 只是为了使用其内置的start 命令,默认调用带有标志CREATE_NEW_CONSOLE 的WINAPI CreateProcessW。这会将 bash.exe 控制台句柄设置为一个标记值,告诉它在启动时分配一个新控制台,而不是继承父控制台。没有什么固有的需要使用 cmd.exe,甚至是控制台应用程序。例如,如果安装了 Windows Python,您可以使用pythonw.exe -c "import subprocess; subprocess.Popen('bash', creationflags=subprocess.CREATE_NEW_CONSOLE)"。它只是更冗长。
  • 感谢第一个命令是我需要的。
  • cmd.exe /c start bash 将再次使用默认用户启动默认 wsl 分发,这可能不是您想要的。如果你没有 python 或者你不想被它所累,那么正确的方法是为相同的发行版和相同的用户启动另一个 wsl 实例,就像我在我的答案中显示的那样。

标签: windows bash ubuntu debian windows-subsystem-for-linux


【解决方案1】:

不需要调用 cmd 两次。我用这种东西:

cmd.exe /c start wsl.exe -d $WSL_DISTRO_NAME --user $LOGNAME -- ssh -p 23 -L 80:10.0.0.1:80 -L 443:10.0.0.1:443 username@remoteserver

这将为同一用户和调用者窗口的分布打开另一个 wsl 窗口,并在其中启动 ssh 会话。 ssh 会话可以替换为您想在新窗口中运行的任何内容...如果您只想要 shell 提示符,请忽略 $LOGNAME 之后的所有内容

【讨论】:

  • 但这会在带有命令提示符图标的命令提示符窗口中打开。这很好,但我们不能像从“开始”菜单启动 Ubuntu 一样启动它,即使用 Ubuntu 图标和正确的窗口名称,即以默认方式启动它吗?
  • 对我来说,在任务栏中生成另一个图标,就像父级(在我的情况下是 Fedora)一样。窗口描述中的图标是普通企鹅,而不是启动它的窗口中的 Fedora 图标。无论如何,我在任何地方都找不到 CMD 图标。
【解决方案2】:

如果你想打开某个发行版,那就更好了 转到资源管理器类型shell:AppsFolder 找到您的发行版 为您的桌面创建快捷方式 并在您的 wsl 中执行此操作

$ cmd.exe /c <absolute path of that shortcut>

例如:

$ cmd.exe /c "C:\Users\fake user which i just made up\Desktop\Ubuntu.lnk"

您还可以将快捷方式复制到某处并使用绝对路径而不是仅使用您可能需要使用 "" 封闭路径的发行版名称

编辑:如果您发现自己遇到此错误 CMD.EXE was started with the above path as the current directory.UNC paths are not supported 我找不到任何解决方案,您可以使用 this docs 到 cmd.exe 参数

【讨论】:

    【解决方案3】:

    这适用于 WSL 中的 bash 提示符。

    cmd.exe /c 启动 cmd.exe /c wsl.exe

    (找到解决方案here

    【讨论】:

    • 如果您安装了多个发行版,这将使用默认用户启动您的默认发行版。这可能不是你想要的。也不需要调用 cmd 两次。
    【解决方案4】:

    从 WSL 启动新窗口的唯一方法是使用某种终端仿真器并启动它。有许多不同的选项:wslttywsl-terminalConemuCmder(基于 Conemu)都会临时想到。 Wsltty 基于 mintty,它是 Cygwin 的默认终端仿真器,这是人们在 WSL 出现很久之前就使用的。我个人喜欢 Cmder,但我发现设置起来很痛苦。 YMMV。

    【讨论】:

    • eryksun 发表的第一条评论正是您如何完成我所要求的。他没有将其作为答案提交,因此我无法将其标记为已解决(据我所知)。虽然我很欣赏终端仿真器的建议。我成为 Cmder 用户已有几年了。
    猜你喜欢
    • 2023-03-28
    • 2011-09-30
    • 2011-07-23
    • 1970-01-01
    • 2012-11-11
    • 2019-03-19
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多