如何将 WSL 默认路径设置为 ~ (Ubuntu)

vvx*_*ues 7 command-line ubuntu windows-subsystem-for-linux windows-terminal wsl2

在 Windows 终端中运行该命令ubuntu会将目录设置为 linux 默认目录,但运行wsl会导致其挂载在/mnt/%USERPROFILE%. 我知道我可以直接运行ubuntu,但我习惯了使用wsl。我检查了我的 Windows 终端配置,结果很好(没有定义目录,使用下拉菜单设置为~)。如果这听起来令人困惑,我很抱歉,因为我对 wsl 还比较陌生。直到最近,终端才出现这样的行为。设置StartingDirectoryCommandLine不起作用。这个问题可能更多地与 WSL 有关,而不是与 Ubuntu 有关

重现步骤

  1. 打开 Windows 终端
  2. 输入命令wsl

预期行为

打开 Ubuntu WSL~

实际行为

打开 Ubuntu WSL/mnt/c/users/<username>

Not*_*1ds 4

虽然无法更改运行时输入的默认wsl.exe目录(出于充分原因,请参见下文),但最好的解决方法是简单地运行wsl ~,它将在默认用户的主目录中启动。对于 Windows 终端,您可以将配置文件的“命令行”设置设置为wsl ~,这将覆盖“起始目录”。

更多说明:

任何可执行文件在 Windows(或 Linux)下启动时,它都会从启动它的应用程序继承“当前工作目录”。它可以(并且经常)在启动期间设置新的工作目录。

和命令wsl.exeubuntu.exe设计略有不同:

  • wsl.exe旨在安装、修改或启动 WSL 本身
  • ubuntu.exe旨在安装、修改或启动 Ubuntu 发行版。与大多数“预打包”WSL 发行版一样,ubuntu.exe它基于Microsoft 提供的WSL 发行版启动器参考实现是 Ubuntu 安装程序/启动器的分叉版本。

您可以检查发行版启动器的源代码并找到WslApiLoader::WslLaunchInteractive具有useCurrentWorkingDirectory布尔参数的代码。这被传递给 (闭源) 中的等效函数wslapi.dll。该 API 反过来启动 Ubuntu 并(通过其init功能):

  • 确定默认用户
  • 查找它们的外壳
  • 在指定目录中启动shell(~如果上述参数为false,否则为父进程工作目录)
  • (以及更多)

ubuntu.exe是启动 Ubuntu 的“简单按钮”版本。它没有为用户提供太多额外的控制。

wsl.exe另一方面,它有相当多的命令行参数,允许您准确控制启动的内容和方式,包括:

  • 通过wsl ~(在主目录中启动的快捷方式)或wsl --cd <directory>
  • 以不同用户身份启动的能力 ( wsl -u <username>)
  • 能够跳过启动默认 shell 并在其位置运行命令 ( wsl -e <command>)
  • 和更多

下面是一个简单的示例,说明了为什么您应该希望wsl.exe命令默认为当前工作目录。来自 PowerShell:

wsl ls -lh
Run Code Online (Sandbox Code Playgroud)

这将(如本答案中所述)向您显示目录列表中人类可读的文件大小,否则在 PowerShell 中不容易做到这一点。

如果wsl.exe默认为主目录,则等效命令将为您提供目录中的文件列表,而不是当前的 PowerShell 目录。

能够wsl直接在 PowerShell 中使用 Linux 命令非常灵活且强大。

出于类似的原因,我建议不要~/.bashrc修改目录。


选择:

虽然wsl ~它非常短(5 个字符,仍然比 少 1 个ubuntu),但您也可以在 PowerShell 中将其“别名”为类似wslh(甚至更短)的名称。但是,由于 PowerShell 别名不支持参数,因此您需要向profile.ps1. 就像是:

function wslh {
    wsl ~ @args
}
Run Code Online (Sandbox Code Playgroud)

这将允许您使用wslh在主目录中启动。您仍然可以使用像wslh -u root -d Ubuntu-22.04 -e ls(et. al.) 这样的参数。

  • @vvxrtues 不用担心!我的不好 - 我忘记了 PowerShell 别名不支持参数 请改用函数 - 我在最后的答案中添加了一个示例。谢谢! (2认同)