Кто обрабатывает пути в Cygwin

Мне любопытно узнать, кто обрабатывает пути в Cygwin.

Например, если я делаю следующее, это работает:

cd C:\

Однако, когда я делаю:

$ pwd
/cygdrive/c

Кто ответственен за несоответствие здесь? Мне любопытно, что "cd C:" среди других инструментов принимает пути окон, но когда они отображаются, они показывают что-то другое.

Если я включу папку cygwin bin в свой путь (под обычным cmd), то я знаю, что все работает как в cmd, так что же вызывает это преобразование, это bash/shell?

1 ответ

Решение

Мне любопытно узнать, кто обрабатывает пути в Cygwin.

В основном, немного кода C++ в winsup/cygwin/path.cc, Особенно важной функцией является normalize_posix_path, Этот код в конечном итоге скомпилирован в DLL cygwin1.dll который используется всеми приложениями Cygwin.

Все пути в Cygwin являются путями "POSIX", разрешаемыми самой библиотекой Cygwin. normalize_posix_path Функция распознает наличие определенного синтаксиса в путях (имена букв дисков и обратные слэши) и организует их обработку как "пути Win32".

Вот почему вы можете кормить c:/Users/... к программе Cygwin, в качестве альтернативы /cygdrive/c/Users/...,

$ pwd

/cygdrive/c

Как это работает, Cygwin поддерживает собственный текущий рабочий каталог Win32, и поэтому он прекрасно знает, что это C:\, Тем не менее, эта нативная информация отображается обратно в путь POSIX. Cygwin делает это путем сканирования таблицы монтирования, где он видит, что C:\ "монтируется" как /cygdrive/c, (The pwd Утилита просто сообщает, что Cygwin реализует POSIX getcwd функция возвращается. Обратное отображение происходит внутри этой функции). Обратите внимание, что поскольку Cygwin работает в виртуальном пространстве имен POSIX, созданном его таблицей монтирования, это пространство содержит абстрактные места, которые не имеют собственного аналога Win32. Например, вы можете cd к /dev каталог, где у вас есть такие записи, как tty, Это не имеет родного местоположения, и так getcwd просто сообщит путь POSIX. Cygwin пытается поддерживать внутреннюю текущую рабочую директорию Cygwin в синхронизации с Win32, когда есть базовое соответствие; это происходит без использования SetCurrentDirectory Функция Win32 и без поддержки концепции, что диски Windows имеют отдельные текущие рабочие каталоги.

Если я включу папку cygwin bin в свой путь (под обычным cmd), то я знаю, что все работает как в cmd, так что же вызывает это преобразование, это bash / shell?

На самом деле, это не все работает, как в cmd! Хотя программы Cygwin понимают пути "Win32-ish", поддержка не завершена. Вы можете пройти путь как D:file.txt в действительно родную программу Windows. Разрешается через текущий каталог, связанный с D диск, который может быть D:\bob\documents в этом случае путь обозначает D:\bob\documents\file.txt, Если такого каталога нет, значит он D:\file.txt, Программа Cygwin не поймет этот путь относительно диска. По факту, D:file.txt даже не распознается как ссылка на букву диска (по состоянию на Cygwin 2.5.2). Это связано с тем, что за двоеточием не следует символ разделителя каталогов (обратный слеш или косая черта).

Другие вопросы по тегам