Какой каталог представляет путь `//` в 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".
Смешно в любом случае;)