
На моем компьютере с Linux в bash у меня есть доступ к папке «double root», обозначенной двумя косыми чертами:
tomas:~ $ cd /
tomas:/ $ ls
bin/ cdrom@ ...
tomas:/ $ cd //
tomas:// $ ls
bin/ cdrom@ ...
Содержимое папки и ее подпапки идентично "нормальному" одинарному слешу root. Двойной слеш не исчезает, когда я открываю его подпапки. Аномалия не повторяется с тремя или более слешами; это простые синонимы для корня:
tomas:// $ cd home/tomas
tomas://home/tomas $ cd ///
tomas:/ $ cd ////
tomas:/ $
Что это за место? Это баг? Может кто-нибудь объяснить аномалию?
решение1
ОтЧасто задаваемые вопросы по Bash E10:
E10) Почему «cd //» оставляет $PWD как «//»?
В POSIX.2 в описании «cd» говорится, чтотриили несколько начальных слешей могут быть заменены одним слешем при канонизации текущего рабочего каталога.
Я полагаю, это сделано для исторической совместимости. Определенные версии Unix и ранние сетевые файловые системы использовали пути в форме //hostname/path для доступа к 'path' на сервере 'hostname'.
решение2
«Это не ошибка, это фича!»
Вы все еще в том же корневом каталоге. Я не знаю, откуда это взялось, но подозреваю, что это как-то связано с построением строк для абсолютных путей. Если кто-то еще знает наверняка, дайте знать.
решение3
Множественные слеши просто игнорируются инструментами, которые вы используете, и вы всегда попадаете в одну и ту же корневую папку.
решение4
При разрешении имени пути несколько косых черт рассматриваются как одна косая черта.
То, что вы видите в приглашении оболочки, является артефактом обработки PS1 в bash (см. раздел «ВЫПОЛНЕНИЕ ЗАПРОСОВ» на странице руководства bash).
[root@linux /]# cd / ; echo $PWD
/
[root@linux /]# cd // ; echo $PWD
//
[root@linux //]# cd /// ; echo $PWD
/
[root@linux /]# cd //// ; echo $PWD
/
Результат — это только вопрос представления; вы всегда находитесь в одном и том же корневом каталоге. Вы можете проверить это, посмотрев на /proc/$$/root
.
[править] Ну, я никогда этого не знал: http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11 Значение «//» не определено стандартами, но «///» и большее количество слешей эквивалентны «/».