Git-Bash и WSL имеют разную структуру каталогов

Git-Bash и WSL имеют разную структуру каталогов

Итак, я сейчас нахожусь в процессе настройки и установки WSL на моей рабочей станции Windows 10, чтобы я мог использовать некоторые очень полезные инструменты командной строки в Windows. Теперь и в WSL, и в Git-Bash у вас есть доступ ко всем дискам и разделам и всем файлам на ПК (к которым имеет доступ ваш пользователь), но пути разные. Допустим, у меня есть каталог, tempрасположенный по адресу с несколькими файлами в нем

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

Затем, когда я открываю Git-Bash (используяэтотSO Q&A) в C:\Tempкаталоге выполните pwdкоманду Я вижу путь как

/c/Temp

но как ни странно, когда я запускаю lsкоманду /в Git-Bash, я не вижу ни cкаталога, ни mntкаталога.

Теперь перейдем к WSL. Когда я делаю это Open Linux Shell hereчерез контекстное меню правой кнопки мыши в проводнике Windows и запускаю, pwdон показывает путь как

/mnt/c/Temp

Итак, мой вопрос: Что такое каталог '/' в Windows и где он находится? И это просто 2 разных способа "имитации" корневого каталога?

Редактировать:
Версия Windows: Windows 10 Enterprise Edition версии 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 не присваивает букв дискам. Это правильный и самый элегантный способ доступа к файлам Windows из WSL. Вот почему bash в WSL имеет другое расположение для вашего C:\.

Если у вас самый распространенный дистрибутив WSL (Ubuntu), то вы /должны быть здесь:

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

Если его там нет или вы используете другой дистрибутив, посмотрите здесь:

%LOCALAPPDATA%\Packages\

Но будьте осторожны, Linux обрабатывает разрешения файлов совсем не так, как Windows. Не делайте здесь ничего с помощью инструментов Windows, таких как File Explorer. Если вам нужно взаимодействовать между ОС, делайте это из WSL.

решение2

просто используйте эту команду в вашем bash

cd //wsl.localhost/dir

Я использую эту команду ниже, чтобы войти в htdocs в моем lampp

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или аналогичном месте в зависимости от того, какой дистрибутив Linux вы установили для WSL.

Для git bash он находится по адресуC:\Program Files\Git

Вы всегда можете узнать реальное местоположение любой папки, перейдя в нее с помощью explorer.exe .git bash, и wsl преобразует .путь для вас и передаст его приложениям Windows, которые вы запускаете.

При этом не следует открывать файлы этих эмулированных /папок через приложения Windows, поскольку они могут иметь проблемы с их корректным чтением, особенно с приложениями WSL.

Эти программы эмулируют файловую систему Unix для вас, не создавая виртуальную машину с раздельными выделениями процессора и памяти. Они просто делятся с Windows, как это делает обычное приложение. (за исключением случая WSLv2, который запускает полную виртуальную машину с использованием Windows 10 Pro Hyper-V)

Расположение /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 не очень хорошо справляется с этим, обычно просто делает все исполняемым.

Связанный контент