Git-Bash 和 WSL 具有不同的目录结构

Git-Bash 和 WSL 具有不同的目录结构

因此,我目前正在 Windows 10 工作站上配置和设置 WSL,以便我可以使用 Windows 上一些非常有用的命令行工具。现在,在 WSL 和 Git-Bash 中,您都可以访问 PC 上的所有驱动器和分区以及所有文件(您的用户可以访问),但路径不同。假设我有一个位于的temp目录,其中有几个文件

tree C:\Temp
C:\TEMP
├───tempfile1.txt
├───tempfile2.txt
└───tempfile3.txt

然后当我打开 Git-Bash(使用SO Q&A)在C:\Temp目录中运行pwd命令,我看到的路径为

/c/Temp

但奇怪的是,当我在 Git-Bash 中运行ls命令时/,我看不到c目录,也没有mnt目录。

现在到 WSL,当我Open Linux Shell here通过 Windows 资源管理器中的右键单击上下文菜单并运行时pwd,它显示路径为

/mnt/c/Temp

所以我的问题是:Windows 中的 '/' 目录是什么?在哪里?这只是“模拟”根目录的两种不同方式吗?

编辑:
Windows 版本:Windows 10 企业版版本 1903(内部版本 18362.267)
WSL 版本:1809(内部版本 17763)(截至撰写本文时的最新版本)

答案1

您的 Git-Bash 是一个典型的 Windows 程序,并且以此方式运行。它将其视为C:\其根目录。

但是,您的 WSL 有所不同。我不确定它是容器还是 VM,但无论如何,它绝对不是典型的 Windows 程序。
它仍然在 Windows 上运行,但您在 WSL 中运行的任何东西本质上都认为自己在 Linux 上运行,而不是在 Windows 上运行。这使得它遵循 Linux 标准,例如 Linux 的目录结构。

这意味着,它有自己的根目录,而不是C:\/此目录的位置位于 AppData 中的某个位置,并且根据 WSL 的版本以及您使用的是 Ubuntu、OpenSUSE 还是其他版本而有所不同。

在 Linux 中,驱动器没有字母。它们被赋予了挂载点。/例如,根目录是根分区的挂载点(在 WSL 中/是文件夹)。并非驱动器下的所有内容都在同一个驱动器上。例如,在我的笔记本电脑上,/home/位于单独的分区上。

/mnt/是 Linux 文件结构中的挂载目录。用于存放外部内容。

/mnt/c/是你的C:\。它必须这样,因为 Linux 没有给出驱动器字母。这是从 WSL 访问 Windows 文件的正确且最优雅的方式。这就是为什么 WSL 中的 bash 为你的 指定了不同的位置C:\

假设你拥有最常见的 WSL 发行版(Ubuntu),你/应该在这里:

%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

如果没有找到或者你使用了其他发行版,请查看此处:

%LOCALAPPDATA%\Packages\

但请注意,Linux 处理文件权限的方式与 Windows 截然不同。请勿使用文件资源管理器等 Windows 工具在此处执行任何操作。如果您需要在操作系统之间进行交互,请在 WSL 内进行。

答案2

只需在 bash 上使用此命令

cd //wsl.localhost/dir

我使用下面的命令进入我的 lampp 中的 htdocs

cd //wsl.localhost/Ubuntu/opt/lampp/htdocs/

答案3

WSL 的 / 文件夹位于 C:\Users\<userName>\AppData\Local\Packages\some serial number for ubuntu installation ,也可以在网络资源 \\wsl$\Ubuntu-18.04或类似资源中找到,具体取决于您为 WSL 安装的 Linux 发行版。

对于 git bash 来说它位于C:\Program Files\Git

您可以随时通过输入explorer.exe .git bash 来找到任何文件夹的真实位置,wsl 将为.您翻译路径并将其传递给您运行的 Windows 应用程序。

话虽如此,你不应该/通过应用程序的窗口打开这些模拟文件夹的文件,因为它们可能无法正确读取它,尤其是使用 WSL 时。

这些程序正在为您模拟 Unix 文件系统,而无需创建具有独立 CPU 和内存分配的虚拟机。它们只是像普通应用程序一样与 Windows 共享。(WSLv2 使用 Windows 10 Pro Hyper-V 运行完整 VM 的情况除外)

/c或位置/mnt/c是网络安装,非常类似于在 Windows 中映射网络驱动器,Z:并假装它是本地磁盘。

GIT bash 和 WSL 正在将您的 Windows 根驱动器挂载为网络资源。在 Linux 中,您将驱动器挂载到,/folder因为没有驱动器号的概念。

如果您愿意,您可以告诉 WSL 以与 git bash 相同的方式挂载驱动器。

在 wsl 类型中编辑/etc/wsl.conf文件

并添加以下内容:

[automount]
root = /

保存文件并从 Windows 中注销并重新登录。

现在,当你启动 WSL 时,它将具有与本地硬盘的 git bash 相同的路径。

另外,请记住,这些都是模拟 Linux 操作系统使用的文件系统,但它们做得并不完美,而且做得也不一样。

例如,Unix 文件系统对文件有权限,git bash 会自动检测“应该”是什么以及可执行文件并添加 +x 属性。WSL 在这方面做得不是很好,通常只是让所有内容都可执行。

相关内容