Кто обрабатывает пути в 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). Это связано с тем, что за двоеточием не следует символ разделителя каталогов (обратный слеш или косая черта).