13

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

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

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

5 ответов5

30

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

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

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

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

9

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

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

Источник

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

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

3

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

1

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

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

MY_WORKSPACE=/home/your_username/workspace/
MY_NEW_PROJECT=$MY_WORKSPACE/my_proj/
cd $MY_NEW_PROJECT 

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

/home/your_username/workspace//my_proj/
1

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .