Почему ls // висит в Cygwin
Когда я запускаю команду ls //
это Cygwin, оболочка зависает около 12 секунд, затем выдает ошибку ls: reading directory '//': Permission denied
, Я помню, что где-то читал /some//path
интерпретируется так же, как /some/path
в пути POSIX, и, соответственно, когда я запускаю команду на виртуальной машине Ubuntu, задержка не возникает, и ls выводит содержимое /
,
Я ничего не могу найти о //
в документации по специальным именам Cygwin, так почему это происходит, и как я могу уменьшить задержку?
Редактировать:
Оказывается \\*
пути - это сетевые пути в Windows. Когда я отключаю свой компьютер от всех сетей, ls \\
немедленно возвращает пустой список Когда я подключаюсь к некоторым сетям, я получаю список узлов в сети, но в других сетях я сталкиваюсь с проблемой, описанной выше. Учитывая это, есть ли способ настроить Windows так, чтобы задержка была уменьшена, даже в случае ошибки разрешения?
3 ответа
Это не проблема Cygwin, это проблема Unix. В первые дни компьютерных сетей, прежде чем Sun (Solaris) представила /net/hostname
синтаксис для доступа к удаленным файловым системам 1 и NFS позволял монтировать удаленные файловые системы в произвольных точках монтирования (например, /mnt
или же /home/username
), некоторые версии Unix реализовали //hostname/pathname
синтаксис для той же цели. Смотрите, на каких системах //foo/bar
отличный от /foo/bar
? С годами этот синтаксис потерял популярность, уступив (в основном?) NFS.
Однако, чтобы эти устаревшие системы были совместимы с POSIX, стандарт явно разрешает //
означать что-то отличное от /
(в начале пути):
Если имя пути начинается с двух последовательных символов
, первый компонент, следующий за начальными символами , может интерпретироваться способом, определяемым реализацией, хотя более двух ведущих символов должны обрабатываться как один персонаж.
(ближе к концу раздела "Разрешение пути")
- хотя это не определяет, что это должно означать (если что-нибудь).
Cygwin интерпретирует //
почти так же, как старый /net
, как задокументировано здесь. Он ссылается на "сетевую" (псевдо) папку Windows - ту, которая содержит "Этот компьютер" и другие обнаруживаемые машины.
См. Также Unix: разница между путями, начинающимися с /
а также //
,
____________
1... и, необязательно, /net
может быть выведен для получения списка имен доступных хостов с экспортированными файловыми системами - то есть файловыми серверами.
На моем компьютере, ls //
также работает медленно, печатая пару cannot access '//some-computer-name': No such file or directory
и в конце напечатайте несколько имен компьютеров. Это ПК с Windows в локальной сети, и, видимо, ls
пытается подключиться к ним (не знаю зачем).
С другой стороны, dir \\
runs quickly and prints the same computer names (no error messages).
I don't think there's a way to configure Windows to prevent that, looks to me like a Cygwin issue (or feature). Best thing would be to write to Cygwin's mailing list about that, asking to fix it.
Anyway, can I ask why do you run ls //
совсем?
https://cygwin.com/cygwin-ug-net/using.html
Существует также виртуальный каталог //, который позволяет перечислять файловые серверы, известные локальному компьютеру, с помощью ls.