Что такое точка точка (..)? Почему его поведение отличается от символических ссылок?


15

Я пытаюсь понять природу ..(двойная точка). Кажется, он указывает на разные цели в зависимости от того, как вы к нему обращаетесь.

Пример:-

    /outer/
        middle/
            inner/
        inner --> ./middle/inner/

Теперь /outer/middle/inner/..ведет к /outer/middle/, но если я получаю к нему доступ через символическую ссылку, /outer/inner/..приводит к /outer/. Кажется, здесь есть два разных ...

Что ..именно? символическая ссылка? жесткая ссылка? Или он генерируется динамически в зависимости от пути доступа к каталогу? Или, возможно, мое понимание символических ссылок неверно.

Редактировать:

Другие связанные наблюдения

    /outer/
        middle/
            file
            inner/
               f --> ./../file
        inner --> ./middle/inner/

Теперь, если я пытаюсь получить доступ к файлу через /outer/inner/fэто работает. Но это не должно, так /outer/inner/../fileкак не указывает на файл. файл находится в /outer/middle/inner/... Кажется, это противоречит описанному выше поведению !?


Обратите внимание, что символические ссылки не являются ярлыками; они больше похожи на указатели.
wizzwizz4

Ответы:


35

..это жесткая ссылка на родительский каталог, который создается как часть записи каталога.

Если вы выполните ls -ailкоманду в каждом из этих каталогов, вы должны увидеть, что все следующие записи имеют одинаковое inode(первое поле) и количество жестких ссылок (третье поле):

  • ..при выполнении ls -ailвinner
  • .при выполнении ls -ailвmiddle
  • middleпри выполнении ls -ailвouter

Теперь / external / middle / inner / .. ведет к / external / middle /, но если я обращаюсь к нему через символическую ссылку, / external / inner / .. ведет к / external /. Кажется, что есть два разных .. здесь.

Есть одна ..запись в inner. Если ваш текущий рабочий каталог outer, вы должны увидеть те же результаты (список каталогов middle) из

  • ls -al inner/..
  • ls -al middle/inner/..

Единственная ситуация , в которой «доступ» ..через символическую ссылку необходимо обеспечить различное поведение, если вам cdв innerиспользовании символической ссылки, чтобы ваш логический рабочий каталог ( pwd -L) отличается от вашего физического рабочего каталога ( pwd -P). В этом случае cd ..вы вернетесь outer не к тому, потому что есть другая ..запись, а к тому, что ваша оболочка отслеживает ваш логический рабочий каталог и выводит вас на один уровень, а не ссылается на фактическую ..запись в inner.

Это удобство, предоставляемое, например, bashкак часть встроенной cdкоманды. Вы можете изменить это, попросив изменить фактическую ..запись с помощью

cd -P ..

где -Pинструктирует cd(как и pwdвыше) использовать физический путь.


Ага, путаница исходит от использования cdдля проверки. Итак, поправьте меня, если я ошибаюсь, ..всегда указывает на физического родителя, если символическая ссылка использует ..его, будет направлена ​​на фактического (физического) родителя. Путаница происходит только с входом cdв каталоги.
user98456

Это также объясняет поведение секунд. Большое спасибо.
user98456

3
@Theophrastus, ls -laiпоказывает вам, что /..это сам корневой каталог, /. или ( или /). Если файловая система не сломана, не должно быть другого случая, когда . == ..; даже когда fs где-то монтируется, он получает правильный ..(временный) родительский ..элемент (так что там происходит какое-то волшебство, а не просто статическая запись в таблице файловой системы).
AnoE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.