Какой каталог представляет путь `//` в Linux?

Когда я хочу вернуться в каталог верхнего уровня в Linux, набрав cd ..Я опечатал cd //, К моему большому удивлению, об ошибках не сообщается. Более того, подсказка становится username@hostname://$, ls указывает, что я сейчас в корневом каталоге.

Это ошибка или особенность оболочки? Если функция // псевдоним /? Моя оболочка - GNU bash, версия 4.1.5(1)-релиз (i686-linux-gnu).

Спасибо и всего наилучшего.

5 ответов

Решение

Это можно рассмотреть либо.

В Linux // ничего не значит - несколько последовательных слешей сворачиваются в один, где угодно на пути, включая начало. Изменение каталога на // ставит вас в /как работает readlink /proc/self/cwd скажет; то же самое, /usr//local///bin свернут в /usr/local/bin,

Однако некоторые другие Unix-подобные системы, например Cygwin или старая Apollo Domain/OS, используют // префикс для сетевых путей, таких как //fileserver/path/to/data, POSIX также позволяет это.

По разным причинам оболочка bash самостоятельно отслеживает текущий каталог (в дополнение к отслеживанию, предоставляемому операционной системой) и содержит код, который предотвращает // быть свернутым, чтобы оставаться совместимым с такими системами. "Особенность" заключается в том, что bash обеспечивает более интуитивное отслеживание текущего каталога, например, когда cdВ символической ссылке bash покажет вам путь, который вы ожидаете, даже если ядро ​​думает иначе. "Ошибка" в том, что bash позволяет // даже в системах, которые его не используют.

Из определения пути POSIX:

Имя пути может содержать один или несколько завершающих слэшей. Несколько последовательных слешей считаются такими же, как один слеш.

Источник

А точнее, как упомянутое в его комментарии ниже, из главы 4.11 о разрешении имен путей:

Имя пути, начинающееся с двух последовательных слешей, может интерпретироваться способом, определяемым реализацией, хотя более двух ведущих слешей следует обрабатывать как один слеш.

Это своего рода особенность. Если у вас есть сценарий оболочки и использовать findНапример, все пути начинаются с префикса./ обычно. Затем, если вы добавите это к фактическому пути, он станет `/my/path/./appended/path, который преобразуется в / my / path / appended / path. Так что, если я не ошибаюсь, // get интерпретируется как /./ и, следовательно, /. Это то же самое, что если вы заходите в / home / user //, вы попадаете в / home / user /

Свойство и все несколько // будут заменены на один /

Это полезно, если у вас есть переменные с путями, как пример в конце. Таким образом, ваш компакт-диск не получит никакой ошибки, и вам не нужно менять переменную рабочей области.

MY_WORKSPACE = / дом / your_username / рабочее пространство /
MY_NEW_PROJECT=$MY_WORKSPACE/my_proj/
CD $MY_NEW_PROJECT 

полное содержимое переменной проекта

 / Главная / имя_пользователя / рабочее пространство // my_proj / 

Я бы пошел для быстрого отображения "ошибка".

Любые пути "/", "//", "//////////////////////",... имеют одинаковое значение: "/". Вы можете добавить столько "/" куда угодно в пути Unix, это не изменит его значения.

"Ошибка" здесь больше связана с тем, что ваша подсказка использует для отображения последний действительный введенный путь, а не фактический "pwd".

Смешно в любом случае;)

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