cd .. w folderze głównym


44

Dlaczego cd ..wpisany w folderze głównym nie ostrzega lub kończy się niepowodzeniem z błędem?

Oczekiwałbym:

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

Zamiast tego jestem w /. Oczywiście ..dzieje się tak, ponieważ istnieje /i jest po /prostu takie jak .. Zastanawiam się tylko, dlaczego tak jest.


6
Brak odpowiedzi, ale tutaj jest dobra związana lektura, Rob Pike na G + omawiający pochodzenie pliku (ów).
bsd

Odpowiedzi:


53

Według Open Group (odpowiedzialnego za standard POSIX):

Każdy katalog ma dokładnie jeden katalog nadrzędny, który jest reprezentowany przez nazwę kropka-kropka w pierwszym katalogu. [...] To, co nazwa pliku kropka-kropka odnosi się do katalogu głównego, jest zdefiniowane w implementacji. W wersji 7 odnosi się do samego katalogu głównego; jest to zachowanie wymienione w POSIX.1-2008. W niektórych systemach sieciowych konstrukcja /../nazwa_hosta/ jest używana do odniesienia do katalogu głównego innego hosta, a POSIX.1 pozwala na to zachowanie.

(Źródło)


29

Nie pojawia się błąd, ponieważ nawet /katalog faktycznie zawiera prawidłowy wpis katalogu .., ale w przeciwieństwie do innych katalogów wskazuje na sam katalog, a zatem zachowuje się identycznie jak .:

$ 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 /..
$

Jako pierwsza kolumna informuje, ., .., i /wszystkie mają ten sam numer i-węzła-więc są te same wpisy plików.

Więc nawet jeśli jesteś w cd ..środku /, po prostu pozostań w środku /.


13
Pytanie pyta dlaczego.. pozycja katalogu ma.
Nick Matteo

3
Jedyny powód, jaki przychodzi mi do głowy, to to, że chcesz traktować /jak każdy inny folder, w tym prawidłowy wpis ... W przeciwnym razie będziesz traktować /inaczej niż wszystkie inne foldery w systemie.
Dohn Joe

15

Jest tam, ponieważ jego usunięcie wymagałoby utworzenia kodu obsługi specjalnych przypadków w jądrze i bibliotekach C. W tej chwili możesz założyć, że zawsze będzie „.” i „..” w dowolnym katalogu, do którego się wybierasz.

Jedynym wymaganym obecnie kodem specjalnym jest kod instalacyjny systemu plików, w którym kod przesłania wartość i-węzła „..”, aby wskazać katalog zawierający punkt podłączenia, ponieważ katalogi główne nie zawsze są katalogami głównymi.


W końcu niemożliwe jest, aby „skierowanie do rodzica” w strukturach drzewa było wolne od specjalnej obsługi przypadków, prawda? Rdzeń musi być z definicji wyjątkowy i każda próba maskowania, która doprowadzi do specjalnych przypadków lub zamieszania w innym miejscu.
musiphil

@musiphil W unixie specjalne przypadki tutaj są tasowane do mountpolecenia i powiązanego z nim specjalnego pliku /etc/fstab.
luser droog

1

Innym sposobem, aby sprawdzić, co .i ..w /naprawdę jest:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Jak widać .i ..jest wskazany /.


1

Innym powodem, dla którego „..” jest w /, jest to, że gdyby go nie było, utworzyłby inny specjalny przypadek: katalog główny miałby o jedno twarde łącze mniej niż wszystkie inne katalogi (wszystkie węzły katalogu mają n + 2 łącza, gdzie n to liczba bezpośrednich podkatalogów w środku). Spowodowałoby to uszkodzenie różnych programów, które polegają na optymalizacji skanowania katalogów.


0

Fajnie, że tam jest, bo inaczej nie byłbym w stanie spamować, ../../../../aby dostać się do katalogu głównego z folderu. Gdyby to nie pozwoliło ..na rootowanie, utknęłbym licząc liczbę folderów w dół od katalogu roboczego.


10
Co jest nie tak z cd /?
Bach,

@ Bach Czasami mashowanie klawiatury jest przyjemniejsze. Poza tym w wielu okolicznościach nie próbujesz przejść do katalogu głównego, w którym to przypadku użycie ../jest lepsze. Wykonuję również wiele operacji na plikach w PHP, których nie mogę wykonać /z kilku powodów.
Skylar Ittner

2
Drugą stroną jest to, że może przypadkowo wpiszesz zbyt wiele ../sekund i operujesz (lub usuwasz) plik, którego nie zamierzałeś bezbłędnie.
jamesdlin

4
Powtarzanie ../więcej razy, niż jest to potrzebne, i życzenie, aby działało zgodnie z przeznaczeniem, wydaje mi się (uśpionym) błędem logicznym, nawet jeśli system plików na to pozwala.
musiphil

@musiphil wpisując spacje między poleceniami - jest błędem logicznym (założenie, że wszystkie spacje między tail -f | grep są koniecznością). Większość ludzi z Unix cierpi z tego powodu. Wpisanie „../ ..” wygląda jak problem z systemem Windows (domyślnie cmd zaczyna się w X: \ Windows i musisz spamować od samego początku). Po co leczyć mały problem, gdy jest większy? (spacje)
kagali-san
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.