cd .. в корневой папке


44

Почему cd .., набранный в корневой папке, не предупреждает или выдает ошибку?

Я бы ожидал:

/$ cd ..
-bash: cd: ..: No such file or directory

Вместо этого я остался в /. Конечно, это так ..как существует /, и просто /, просто так .. Мне просто интересно, почему это так.


6
Нет ответа, но вот хорошее связанное чтение, Роб Пайк на G + обсуждает происхождение файла (-ов).
BSD

Ответы:


53

Согласно Open Group (отвечает за стандарт POSIX):

Каждый каталог имеет ровно один родительский каталог, который представлен точечной точкой имени в первом каталоге. [...] То, к чему относится имя файла точка-точка относительно корневого каталога, определяется реализацией. В версии 7 это относится к самому корневому каталогу; это поведение, упомянутое в POSIX.1-2008. В некоторых сетевых системах конструкция /../hostname/ используется для ссылки на корневой каталог другого хоста, и POSIX.1 разрешает такое поведение.

(Источник)


29

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

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Поскольку первый столбец говорит вам, ., ..и /все они имеют один и тот же индексный дескриптор-номер и , таким образом , одни и те же элементы файловой системы.

Так что даже если вы cd ..внутри /себя, просто оставайтесь внутри /.


13
Вопрос спрашивает, почему в ..каталоге есть запись.
Ник Маттео

3
Единственная причина, которая приходит мне в голову, заключается в том, что вы хотите обращаться с /любой другой папкой, включая допустимую запись для ... В противном случае вам придется обращаться по- /разному по сравнению со всеми другими папками в системе.
Дон Джо

15

Это происходит потому, что удаление этого потребует создания специального кода для обработки в ядре и библиотеках Си. Прямо сейчас вы можете предположить, что всегда будет «.» и ".." в любом каталоге, в который вы идете.

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


В конце концов, «родитель-реферал» в древовидных структурах не может быть свободен от какой-либо специальной обработки, не так ли? Корень должен быть особенным по определению, и любая попытка маскировки приведет к особым случаям или путанице в другом месте.
Musiphil

@musiphil В Unix особые случаи здесь перетасовываются в mountкоманду и связанный с ней специальный файл /etc/fstab.
luser droog

1

Еще один способ проверить, что .и ..на /самом деле:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Как видите, так .и ..указано /.


1

Еще одна причина, по которой «..» находится в /, заключается в том, что если бы его там не было, это создало бы другой особый случай: корневой каталог имел бы на одну жесткую ссылку меньше, чем все другие каталоги (все узлы каталога имеют n + 2 ссылки, где n - это количество прямых подкаталогов внутри). Это сломало бы различные программы, которые используются для оптимизации сканирования каталогов.


0

Хорошо, что он там есть, потому что иначе я бы не смог спамить, ../../../../чтобы попасть в корень из папки. Если бы он не позволял ..в корне, то я бы застрял, считая количество папок в рабочем каталоге.


10
Что не так с cd /?
Бах

@ Бах Иногда, затирание клавиатуры веселее. Кроме того, во многих случаях вы не пытаетесь перейти к корню, в этом случае использование ../лучше. Я также делаю много файловых операций в PHP, где я не могу сделать это /по нескольким причинам.
Скайлар Итнер

2
С другой стороны, возможно, вы случайно ввели слишком много ../s и оперировали (или удалили) файл, который вы не собирались без ошибок.
jamesdlin

4
Повторение ../большего количества раз, чем необходимо, и желание работать так, как задумано, для меня выглядит как (неактивная) логическая ошибка, даже если файловая система, по-видимому, это допускает.
Musiphil

@musiphil - ввод пробелов между командами - логическая ошибка (допущение, что все пробелы между tail -f | grep обязательны). Большинство людей Unix страдают от этого. Ввод "../ .." выглядит как проблема Windows-фолка (по умолчанию cmd начинается в X: \ Windows, и вам нужно спамить .. с самого начала). Зачем лечить маленькую проблему, когда есть большая? (пробелы)
Кагали-сан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.