Dlaczego katalog główny jest oznaczony znakiem /?

95

Przeprowadziłem pewne badania na ten temat w Google, ale wyniki były mętne. Dlaczego /znak jest używany do oznaczenia katalogu głównego? Czy są za tym jakieś solidne powody?

Ruban Savvy
źródło
12
Powodem jest to, że „/” jest separator katalogu i podczas gdy sam katalog główny jest bezimienny, tak jak cd /homejest odpowiednikiem cd /home/dodanie /na końcu pustą nazwą zapewnia dostęp do tego katalogu.
SF.
2
Czytałeś to: en.wikipedia.org/wiki/Root_directory ?
Kevdog777,
11
Jest bezimienny, ponieważ patrząc od wewnątrz, stanowi granicę widocznego drzewa katalogów. Widoczna hierarchia katalogów może być jedynie poddrzewem w większej hierarchii, na przykład, gdy wyszukiwania nazw ścieżek zostały zmodyfikowane przez chroot()wywołanie, ale patrząc od wewnątrz, jest to abstrakcyjne.
Thomas Nyman,
14
Ponieważ pusty łańcuch byłby okropnym wyborem!
Bakuriu,
3
Oprócz tego, co wspomniano, użycie / do wskazania katalogu głównego daje pewne skutki uboczne w kategoriach bezwzględnych i względnych nazw ścieżek. /some/dirZAWSZE oznacza (root)/some/dir, że while some/dirzawsze odnosi się do bieżącego katalogu roboczego. Zasadę tę można również przenieść na wykorzystanie adresu URL.
Tor Valamo,

Odpowiedzi:

108

Ukośnik /jest znakiem ograniczającym, który oddziela katalogi ścieżkami w systemach operacyjnych typu Unix. Wygląda na to, że postać ta została wybrana w latach 70. XX wieku i według niepotwierdzonych źródeł przyczyny mogą być związane z tym, że poprzednik systemu operacyjnego Multics , będącego poprzednikiem systemu Unix , użył >znaku jako separatora ścieżek, ale projektanci systemu Unix już zarezerwowali znaki >i <oznaczać przekierowanie We / Wy w linii poleceń powłoki na długo przed tym, jak miały wielopoziomowy system plików. Kiedy więc nadszedł czas na zaprojektowanie systemu plików, musieli znaleźć inny znak oznaczający rozdzielenie elementu ścieżki.

Należy tutaj zauważyć, że w powszechnie używanym terminalu ADM-3A Lear-Siegler w latach 70. XX wieku, z którego pochodzi między innymi praktyka używania ~znaku do reprezentowania katalogu domowego , /klucz znajduje się obok >klucza:

układ klawiatury terminala Lear-Siegler ADM-3A

Jeśli chodzi o to, dlaczego katalog główny jest oznaczony jako pojedynczy /, jest to konwencja, na którą najprawdopodobniej wpływa fakt, że katalog główny jest katalogiem najwyższego poziomu w hierarchii katalogów, a podczas gdy inne katalogi mogą być pod nim, zwykle nie ma „ powód odwoływania się do czegokolwiek poza katalogiem głównym. Podobnie sama pozycja katalogu nie ma nazwy, ponieważ jest granicą widocznego drzewa katalogów.

Thomas Nyman
źródło
2
„podczas gdy inne katalogi mogą być pod nim, zwykle nie ma powodu, aby odwoływać się do czegokolwiek poza katalogiem głównym”. Nie rozumiem tego Nie jestem pewien, w jakim kierunku masz na myśli „poniżej”, ale nie ma nic „poza”, w której hierarchii się znajduje /. Systemy plików Unix są pojedynczym drzewem z punktami montowania dla różnych dysków.
Alexis,
4
Jest też coś chroottakiego - nie możesz uzyskać dostępu do niczego poza nowym rootem, ale to nie znaczy, że ich tam nie ma.
Bobson,
1
@Gilles, fizyczna lokalizacja dysku nie jest pytaniem. W tym sensie każda partycja dyskowa znajduje się poza partycją główną, ale jest zamontowana pod rootem w hierarchii systemu plików. Bobson, dobra uwaga na temat chroot, ale nie pasuje to do tego, co powiedział Thomas: Po chroot nie jest tak, że „zwykle nie ma powodu”, aby wyjść poza root systemu; to niemożliwe. W systemie Unix wszystko w systemie plików znajduje się w katalogu głównym.
Alexis
1
„Po chroot nie chodzi o to, że„ zwykle nie ma powodu, aby wyjść poza root systemu; jest to niemożliwe ”. To jest po prostu źle. W momencie chroot()wprowadzenia nie miał żadnych właściwości podobnych do więzienia , jedynie wpływał na rozpoznawanie nazw ścieżek. Nawet dzisiaj, procesy uprzywilejowane mogą wyrwać się z chroot przez projekt . Wspomniałem również chroot()we wcześniejszym komentarzu .
Thomas Nyman,
4
IIRC, konwencja Multics używana nie tylko >jako separator katalogów, ale także <w odniesieniu do katalogu nadrzędnego: <sam w sobie był równoważny .., podczas gdy <foobył równoważny ../foo. Zawsze uważałem to za estetyczne.
Mark Reed,
55

Pierwszy hierarchiczny system plików, jaki znamy dzisiaj, został zaprojektowany dla Multics . Projekt został opisany w „Ogólnozadaniowym systemie plików do dodatkowego przechowywania” autorstwa RC Daley i PG Neumanna. Istotną cechą tego systemu plików jest to, że katalog jest plikiem, który może być zawarty w katalogu, tak jak każdy inny plik. Struktura pliku tworzy drzewo, w którym wszystkie węzły inne niż liście są katalogami. Katalog główny drzewa jest zawsze katalogiem. Każdy plik ma nazwę (nazwę wpisu ), która jest unikalna w swoim katalogu nadrzędnym. Katalog główny nie ma nazwy, ponieważ nie znajduje się w innym katalogu.

Aby wyznaczyć plik, musisz opisać ścieżkę z katalogu głównego drzewa. Multics przyjął naturalną składnię dla nazw ścieżek, gdzie jeśli Pjest ścieżką do katalogu i Fjest nazwą pliku, to jest składnią pliku wywoływanego w katalogu, którego ścieżka jest .P>FFP

W czasach, gdy nie chcesz obciążać się katalogami, Multics miał pojęcie katalogu roboczego . Naga nazwa pliku bez wskazania katalogu jest interpretowana jako plik w katalogu roboczym.

Łącząc te reguły, fooznajduje się plik w katalogu roboczym; foo>barto plik w katalogu potomnym katalogu fooroboczego i tak dalej. Reguły te opisują ścieżki względne, ale do zbudowania ścieżek bezwzględnych zaczynających się od katalogu głównego potrzebna jest dodatkowa reguła. Biorąc pod uwagę, że odczytanie nazwy ścieżki od lewej do prawej odpowiada przeniesieniu z korzenia do liści drzewa, korzeń powinien być oznaczony specjalnym znacznikiem po lewej stronie nazwy ścieżki. Ponieważ nazwy plików nigdy nie są puste (ponieważ byłoby to często mylące), żadna względna nazwa ścieżki nigdy nie zaczyna się od znaku >, co czyni go wygodnym markerem dla bezwzględnych nazw ścieżek. Tak więc >fooplik jest wywoływany foow katalogu głównym, >foo>barto plik wywoływany barw katalogu o nazwiefoow katalogu głównym i tak dalej. Pozostawia to katalog główny, który może być pustym ciągiem; jednak często nie jest wygodne używanie pustego łańcucha jako nazwy ścieżki, więc zamiast tego jest zapisywany >, co ma tę dodatkową zaletę, że nazwa ścieżki jest bezwzględna tylko wtedy, gdy jest to jej pierwszy znak >.

Unix przyjął ten projekt od Multics. Ponieważ Unix już używał znaku >do przekierowania wyjścia w swojej powłoce poleceń, jego projektanci wybrali inny znak /do oddzielenia katalogów w nazwach ścieżek.

Gilles
źródło
11

W komponentach nazw ścieżek w Uniksie nie można używać tylko dwóch znaków: znaku pustego, który kończy łańcuchy w C (język jądra) oraz ukośnika, który jest zarezerwowany jako separator ścieżki. Ponadto komponenty ścieżki nie mogą być pustymi łańcuchami.

Zatem w nazwie ścieżki mamy tylko dwa rodzaje tokenów: ukośnik i komponent.

Załóżmy, że bez dodawania nowych tokenów chcielibyśmy obsługiwać dwa typy ścieżek: względną i bezwzględną. Ponadto chcielibyśmy móc odwoływać się do katalogu głównego, który nie ma nazwy (nie ma rodzica, który nadałby mu nazwę).

Jak możemy reprezentować ścieżki względne, ścieżki bezwzględne i odwoływać się do katalogu głównego, używając tylko ukośnika?

Najbardziej oczywistym sposobem rozszerzenia języka (innym niż wprowadzenie nowego tokena) jest utworzenie nowej składni: nadanie nowego znaczenia kombinacjom tokenów, które są niepoprawną składnią.

Ścieżki zaczynające się od ukośnika nie mają sensu, więc dlaczego nie użyć początkowego ukośnika jako znacznika wskazującego „ta ścieżka jest bezwzględna, a nie względna”.

Ścieżka, która zawiera tylko ukośnik, jest również nieprawidłowa, więc dlaczego nie przypisać jej znaczenia „katalog główny”.

Te dwa znaczenia łączą się ze sobą, ponieważ ścieżka bezwzględna rozpoczyna wyszukiwanie w katalogu głównym. Innymi słowy, wiodący ukośnik można uznać za mający znaczenie:

  • przejdź do katalogu głównego i użyj znaku ukośnika.
  • jeśli na ścieżce znajduje się więcej materiału, przetworz go jako ścieżkę względną, w przeciwnym razie gotowe.

Następnie moglibyśmy również dodać ukośnik końcowy, co może oznaczać, że „ta ścieżka zapewnia, że ​​ostatni składnik ścieżki jest nazwą katalogu, a nie zwykłego pliku lub innego rodzaju obiektu: ten ukośnik oznacza ten katalog podobnie jak sposób, w jaki wiodący ukośnik oznacza katalog główny. ”

Przy całej powyższej składni nadal mamy składnię o nieprzypisanym znaczeniu: podwójne ukośniki, potrójne ukośniki i tak dalej.

Dlaczego nie po prostu wprowadzić kolejny token i zrobić to inaczej. Jest tak prawdopodobnie dlatego, że projektanci przyjęli ogólnie minimalistyczne podejście. (Dlaczego ededytor wyświetla tylko, ?gdy zrobisz coś źle?) Ukośnik jest łatwy do pisania i nie wymaga zmiany. Język ścieżki z tylko dwoma typami tokenów (komponent i ukośnik) jest łatwy do zapamiętania i używania.

Inną ważną kwestią jest to, że łatwe manipulowanie ścieżkami jest możliwe przy użyciu tylko reprezentacji ciągów. Na przykład możemy dość łatwo „zrootować” absolutne ścieżki do nowego katalogu nadrzędnego:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

To nie zadziałałoby, gdybyśmy wskazali ścieżki bezwzględne w inny sposób, na przykład wiodący znak dolara lub cokolwiek innego:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Ten rodzaj kodowania jest nadal potrzebny w niektórych przypadkach, gdy mamy do czynienia ze ścieżkami w stylu uniksowym, ale jest go mniej.

Kaz
źródło
8
„Cięcie jest łatwe do pisania i nie wymaga zmiany”. Może łatwo wysiąść za stawem, ale tutaj, w Finlandii, musimy nie tylko nacisnąć Shift, ale także dotrzeć do szeregu liczb . ; P
Thomas Nyman,
1
@ThomasNyman Tak czy inaczej, zagraniczne układy klawiatury prawdopodobnie nie były przedmiotem zainteresowania Kena Thompsona. Slash był łatwy do napisania dla programistów Uniksa i ich pierwszych użytkowników.
Kaz
1
Słusznie. Chociaż głównie żartowałem, uważam za interesujące (a czasem zabawne), w jaki sposób niektóre osobliwości oprogramowania o długim dziedzictwie można wytłumaczyć osobliwościami współczesnego sprzętu .
Thomas Nyman,
@ThomasNyman Haha, zastanawiam się, czy sam Bill Joy zaloguje się i zaktualizuje części {potrzebne potrzebne} na tej stronie ADM-3A, czy „Wikidickhead” odpowie następnie: „ten artykuł zawiera oryginalne badania”. :)
Kaz
@ThomasNyman, Teraz wierzę, że istnieją klawiatury „pedałowe”, za /pomocą których można pisać za pomocą prawej stopy. Podobnie jak gra na pianinie.
Pacerier