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

13

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

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

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

Summer_More_More_Tea
источник
См. Superuser.com/q/314102/91047
Стефан Гименес

Ответы:

30

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

В 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 разрешает //даже в системах, которые его не используют.

user1686
источник
Интересно, что zshпозволяет cd //, но достаточно умен, чтобы просто показать /в строке приглашения.
new123456
@BinaryZebra Bitsavers имеет коллекцию старых руководств Unix, в том числе Apollo - там должно быть множество примеров. На сайте TUHS тоже должно быть что-то.
user1686
Большое спасибо, я нашел описание для // в руководстве Bitsavers.
9

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

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

Источник

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

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

Shadok
источник
1
Более правильным разделом является 4.11 Разрешение пути (последний абзац), поскольку рассматриваемое поведение отображается только для двух ведущих косых черт.
user1686
3

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

Чак Р
источник
1

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

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

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

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

Ouki
источник
Согласен - //в приглашении есть побочный эффект переменной среды вашего приглашения ( $PS1) - как это PS1определяется?
Даг Харрис
@DougHarris $PS1переменная определяется как [\u@\h \W]\$. Есть проблемы с настройкой?
Summer_More_More_Tea
Странный. Если я попробую PS1, я получу только один, /когда pwd = /. Я задавался вопросом, делали ли вы какую-либо дополнительную работу, чтобы получить каталог. Является ли $PROMPT_COMMANDустановить?
Даг Харрис
@DougHarris Да, эта переменная установлена, значение которой равно echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Не могли бы вы объяснить немного подробнее? Я не совсем знаком с этими двумя переменными. Благодарю.
Summer_More_More_Tea
Прочитайте справочную страницу bash и найдите PS1и PROMPT_COMMAND- используйте man bashв командной строке или прочитайте онлайн
Даг Харрис
1

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

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

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

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

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

phschoen
источник