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 ed
edytor 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.
cd /home
jest odpowiednikiemcd /home/
dodanie/
na końcu pustą nazwą zapewnia dostęp do tego katalogu.