Czym dokładnie jest kropka (..)? Dlaczego jego zachowanie różni się w przypadku dowiązań symbolicznych?

15

Próbuję zrozumieć naturę ..(podwójna kropka). Wydaje się wskazywać na różne cele w zależności od tego, w jaki sposób masz do niego dostęp.

Przykład:-

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

Teraz /outer/middle/inner/..prowadzi do /outer/middle/, ale jeśli uzyskam do niego dostęp poprzez łącze symboliczne, /outer/inner/..prowadzi do /outer/. Wygląda na to, że są tu dwa różne ...

Co to jest ..dokładnie link symboliczny? twardy link? A może jest generowany dynamicznie w zależności od ścieżki dostępu do katalogu? A może moje rozumienie dowiązań symbolicznych jest błędne.

Edytować:

Inne powiązane obserwacje

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

Teraz, jeśli spróbuję uzyskać dostęp do pliku przez /outer/inner/fto działa. Ale nie powinno, ponieważ /outer/inner/../filenie wskazuje pliku. plik jest w /outer/middle/inner/... Wydaje się to przeczyć powyższemu zachowaniu !?

użytkownik98456
źródło
Zauważ, że dowiązania symboliczne nie są skrótami; są bardziej jak wskaźniki.
wizzwizz4

Odpowiedzi:

35

..to stałe łącze do katalogu nadrzędnego, który jest tworzony jako część wpisu katalogu.

Jeśli wydajesz ls -ailw każdym z tych katalogów, powinieneś zobaczyć, że wszystkie poniższe wpisy mają to samo inode(pierwsze pole) i twarde łącze (trzecie pole):

  • ..podczas wykonywania ls -ailwinner
  • .podczas wykonywania ls -ailwmiddle
  • middlepodczas wykonywania ls -ailwouter

Teraz / external / middle / inner / .. prowadzi do / outer / middle /, ale jeśli uzyskam do niego dostęp poprzez łącze symboliczne, / outer / inner / .. prowadzi do / external /. Wygląda na to, że są tu dwa różne ...

Jest jeden ..wpis w inner. Jeśli bieżącym katalogiem roboczym jest outer, powinieneś zobaczyć te same wyniki (lista katalogów middle) z

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

Jedyna sytuacja, w której „dostępu” ..przez dowiązania symbolicznego powinna zapewniać różne zachowanie jest, jeśli cdsię innerza pomocą łącza symbolicznego, tak że logiczne katalogu roboczego ( pwd -L) różni się od swojej fizycznej katalogu roboczym ( pwd -P). W takim przypadku cd ..cofniesz się outer nie dlatego, że jest inny ..wpis, ale dlatego, że twoja powłoka śledzi logiczny katalog roboczy i wyskakuje o jeden poziom, zamiast odwoływać się do rzeczywistego ..wpisu inner.

Jest to wygoda zapewniana przez, na przykład, bashjako część wbudowanego cdpolecenia. Możesz to zmienić, prosząc o zmianę na rzeczywistą ..pozycję za pomocą

cd -P ..

gdzie -Pinstruuje cd(jak pwdwyżej), aby użyć ścieżki fizycznej.

użytkownik4556274
źródło
Aha, zamieszanie wynika z używania cddo sprawdzania. Więc popraw mnie, jeśli się mylę, ..zawsze wskazuje na fizycznego rodzica, jeśli dowiązanie symboliczne ..zostanie przekierowane do faktycznego (fizycznego) rodzica. Zamieszanie zdarza się tylko po wejściu cddo katalogów.
user98456
To wyjaśnia także zachowanie sekund. Dziękuję Ci bardzo.
user98456,
3
@Theophrastus, ls -laipokazuje, że /..to jest sam katalog główny (aka /. lub /). O ile system plików nie jest uszkodzony, nie powinno być innego przypadku . == ..; nawet gdy gdzieś zamontowany jest fs, otrzymuje poprawność ..(tymczasowego) rodzica (więc dzieje się tam trochę magii, ..nie jest to zwykły, statyczny wpis w tabeli systemu plików).
AnoE,