Когда я запускаю команду ls // is Cygwin, оболочка зависает примерно на 12 секунд, а затем выдает ошибку ls: reading directory '//': Permission denied . Я помню, как где-то читал, что /some//path интерпретируется так же, как /some/path в путях POSIX, и, соответственно, когда я запускаю команду на виртуальной машине Ubuntu, задержки нет, и ls выводит содержимое / .

Я не могу найти что-нибудь о // в документации по специальным именам Cygwin, так почему это происходит, и как я могу уменьшить задержку?

Редактировать:

Оказывается, \\* пути - это сетевые пути в Windows. Когда я отключаю компьютер от всех сетей, ls \\ немедленно возвращает пустой список. Когда я подключаюсь к некоторым сетям, я получаю список узлов в сети, но в других сетях я сталкиваюсь с проблемой, описанной выше. Учитывая это, есть ли способ настроить Windows так, чтобы задержка была уменьшена даже в случае ошибки разрешения?

3 ответа3

1

Это не проблема Cygwin, это проблема Unix.  В первые дни компьютерных сетей до того, как Sun (Solaris) ввела синтаксис /net/hostname для доступа к удаленным файловым системам 1, а NFS позволяла монтировать удаленные файловые системы в произвольных точках монтирования (например, /mnt или /home/username), в некоторых версиях Unix для той же цели реализован синтаксис //hostname/pathname .  См. На каких системах //foo/bar отличается от /foo/bar?  С годами этот синтаксис потерял популярность, уступая (в основном?) в NFS.

Тем не менее, чтобы позволить этим устаревшим системам быть POSIX-совместимыми, стандарт явно позволяет // означать что-то отличное от /начале пути):

Если имя пути начинается с двух последовательных символов <slash>, первый компонент, следующий за начальными символами <slash>, может интерпретироваться способом, определяемым реализацией, хотя более двух ведущих символов <slash> должны обрабатываться как один <slash> персонаж.
        (ближе к концу раздела «Разрешение пути»)

- хотя это не определяет, что это должно означать (если что-нибудь).

Cygwin интерпретирует // то же самое, что и старый /net , как описано здесь.  Он ссылается на «сетевую» (псевдо) папку Windows - ту, которая содержит «Этот компьютер» и другие обнаруживаемые машины.

Смотрите также Unix: разница между путями, начинающимися с / и //.
____________
1 … и, опционально, может быть указан /net для получения списка имен доступных хостов с экспортированными файловыми системами - то есть файловыми серверами.

0

На моем компьютере ls // также работает медленно, печатая пару cannot access '//some-computer-name': No such file or directory , и в конце печатаю несколько имен компьютеров. Это ПК с Windows в локальной сети, и, очевидно, ls пытается подключиться к ним (не знаю зачем).

С другой стороны, dir \\ работает быстро и печатает те же имена компьютеров (без сообщений об ошибках).

Я не думаю, что есть способ настроить Windows, чтобы предотвратить это, похоже на проблему Cygwin (или функцию). Лучше всего было бы написать об этом в список рассылки Cygwin с просьбой исправить это.

В любом случае, могу я спросить, почему вы вообще запускаете ls // ?

0

https://cygwin.com/cygwin-ug-net/using.html#unc-paths

Существует также виртуальный каталог //, который позволяет перечислять файловые серверы, известные локальному компьютеру, с помощью ls.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .