在 Windows 终端中运行该命令ubuntu
会将目录设置为 linux 默认目录,但运行wsl
会导致它挂载在/mnt/%USERPROFILE%
。我知道我可以直接运行ubuntu
,但我习惯使用wsl
。我检查了我的 Windows 终端配置,这很好(没有定义目录,使用下拉菜单设置为~
)。如果这听起来可能令人困惑,我很抱歉,因为我对 wsl 还比较陌生。直到最近,终端才像这样运行。设置StartingDirectory
或CommandLine
不起作用。这个问题可能与 WSL 比与 Ubuntu 更相关
重现步骤
- 打开 Windows 终端
- 输入命令
wsl
预期行为
在以下位置打开 Ubuntu WSL~
实际行为
在以下位置打开 Ubuntu WSL/mnt/c/users/<username>
答案1
虽然没有办法改变默认运行时输入的目录wsl.exe
(有充分理由,见下文),最好的解决方法是简单地运行wsl ~
,它将从默认用户的主目录中启动。对于 Windows 终端,您可以将配置文件的“命令行”设置设置为wsl ~
,这将覆盖“起始目录”。
更多解释:
什么时候任何可执行文件在 Windows(或 Linux)下启动时,会从启动它的应用程序继承“当前工作目录”。它可以(并且通常会)在启动期间设置新的工作目录。
wsl.exe
和命令ubuntu.exe
在设计上略有不同:
wsl.exe
旨在安装、修改或启动 WSL 本身ubuntu.exe
旨在安装、修改或启动 Ubuntu 发行版。与大多数“预打包”的 WSL 发行版一样,ubuntu.exe
它基于WSL 发行版启动器参考实现由微软提供。 这里是 Ubuntu 安装程序/启动器的分叉版本。
您可以检查 distro-launcher 的源代码,并找到WslApiLoader::WslLaunchInteractive
具有useCurrentWorkingDirectory
布尔参数的。这将传递给 (closed-source) 中的等效函数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
这将(如在这个答案)向您展示人类可读目录列表中的文件大小,否则在 PowerShell 中很难做到这一点。
如果wsl.exe
默认为主目录,则等效命令将为您提供以下文件列表:那目录,而不是当前 PowerShell 目录。
能够直接在 PowerShell 中使用 Linux 命令wsl
非常灵活且功能强大。
出于类似的原因,我建议不要~/.bashrc
修改您的目录。
选择:
虽然wsl ~
很短(5 个字符,仍然比 少 1 个ubuntu
),但您也可以wslh
在 PowerShell 中将其“别名”为类似(甚至更短)的内容。但是,由于 PowerShell 别名不支持参数,因此您需要向 中添加一个函数profile.ps1
。例如:
function wslh {
wsl ~ @args
}
这将允许您使用wslh
从主目录启动。您仍然可以使用类似wslh -u root -d Ubuntu-22.04 -e ls
(et. al.) 的参数。