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