Czy `~ / Documents` jest ścieżką względną czy bezwzględną?


37

To tylko pytanie słownictwa, które jednak wciąż kręci się w mojej głowie.

Pochodzi z egzaminu praktycznego z książki przygotowawczej LPIC . Prawidłowa odpowiedź według książki jest taka, że ~/Documentsjest to katalog względny, ponieważ jest względny do katalogu domowego.

Jednak ta książka zawiera honorowy stosunek literówek i błędów, więc nie mogę brać za pewnik wszystkiego, co tam jest napisane. Tutaj się nie zgadzam, ponieważ dla mnie ~działa jak zmienna rozwinięta przez powłokę do zawartości $HOMEzmiennej lub bieżącej ścieżki katalogu domowego użytkownika (porównaj man bash), więc rzeczywista ścieżka jest /home/myuser/Documentskatalogiem absolutnym.

Nawet Wikipedia , choć raz, nie wydaje mi się pomocna w tym temacie (nawet jeśli wydaje się potwierdzać, że książka jest błędna w tym temacie):

Bezwzględna lub pełna ścieżka wskazuje tę samą lokalizację w systemie plików, niezależnie od bieżącego katalogu roboczego. Aby to zrobić, musi zawierać katalog główny.

Natomiast ścieżka względna rozpoczyna się od określonego katalogu roboczego, unikając konieczności podawania pełnej ścieżki bezwzględnej.

Tutaj również się nie zgadzam: zgodnie z tą definicją ścieżka, /opt/kde3/bin/../libktóra nie zależy od bieżącego katalogu roboczego, powinna być absolutna, jednak moje obecne rozumienie tego odpowiada autorowi książki, czyniąc tę ​​ścieżkę względną.

Według Webster Dictionary szybkie wyszukiwanie w Internecie tylko dodaje mi frustracji :

ścieżka bezwzględna - ścieżka względna do katalogu głównego. Pierwszym znakiem musi być separator nazwy ścieżki.

A $HOME/Documentsmoże po prostu $HOMEnie będą uważane za katalogi absolutne? A może ta definicja implikuje zmienną ekspansję? Co z ~postacią muszli ? Czy jest jakaś wiarygodna definicja katalogu względnego i bezwzględnego, którą mogę znaleźć i czy się mylę przez całą drogę?


7
Wszystkie ścieżki są względne, niektóre z nich są tylko względne do katalogu głównego /, a te, które nazywamy absolutnymi. Zatem wszystko, co zaczyna się od /nazwałbym absolutny (nawet jeśli jest /usr/../etc) i wszystko co nazwałbym względna ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Chodzi o to, że absolut powinien działać niezależnie od bieżącego katalogu roboczego lub bieżącego użytkownika. Względny może działać tylko w niektórych szczególnych wąskich przypadkach.
jimmij

6
Ścieżka może rozwinąć się w inne miejsce w zależności od tego, kim jest użytkownik. To powiedziawszy, moim zdaniem jest to wciąż ścieżka absolutna, a nie względna. Chociaż nie sądzę, aby definicje ścieżki absolutnej i względnej były tak precyzyjnie zdefiniowane. To nie jest matematyka. To pytanie tak naprawdę nie testuje zrozumienia, imo i jest bezcelowe.
Faheem Mitha,

1
@FaheemMitha: LPIC to neutralny pod względem dystrybucji certyfikat Linux. Sam certyfikat wydaje się w porządku, ale wcale nie jest tak w przypadku (przynajmniej niektórych) książek sprzedanych w celu przygotowania się do tego egzaminu jako samodzielnej nauki ...
WhiteWinterWolf

2
@jimmij: „krewny” ma specyficzne znaczenie techniczne w kontekście ścieżek, a używanie innego anglojęzycznego znaczenia tego słowa jest złą praktyką. Całkowicie nie zgadzam się z powołaniem ~/foościeżki względnej. Dostajesz różnicę między kodowaniem na stałe a parametryzacją. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Peter Cordes,

1
Definicje słownika Webster są poprawne, ale bardzo mylące. Oznacza to jednak, że ciągi takie jak ~/Documentsi $HOME/Documentsnie są ścieżkami. Po ekspansji identyfikują (absolutne) ścieżki, ale same nie są ścieżkami. Myślę, że zgadza się to z tym, ilu użytkowników Unix / Linux używa tego terminu, ale bez wątpienia te ciągi nazywane są również ścieżkami.
reinierpost

Odpowiedzi:


41

Jeśli autor próbował cię złapać, mówiąc o tym dosłownym ciągu (bez rozwinięcia powłoki) jako ścieżce, to jest to ścieżka względna ( mkdir -p './~/Documents'). Inaczej:


Jest to ścieżka bezwzględna , ponieważ jej rozwiązanie nie zależy od bieżącego katalogu roboczego procesu. Ścieżka względna zawsze oznacza względem katalogu roboczego procesu. Lub w przypadku obiektów dowiązania symbolicznego, w stosunku do lokalizacji dowiązania symbolicznego. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2). Ma to znaczenie dla montowań NFS i innych przypadków, w których można dostać się do tego samego dowiązania symbolicznego różnymi ścieżkami bezwzględnymi. na przykład

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian czasami instaluje dowiązania symboliczne ../../doc/whatever/whatever, zamiast bezwzględnego celu dowiązania symbolicznego, więc działa, gdy NFS jest zamontowany gdzieś indziej, lub gdy patrzy na chroota bez chroot(8)wchodzenia w niego.

Każdy proces uniksowy ma swój własny plik cwd. pwdKomenda istnieje po prostu go wydrukować.

patrz: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html, aby uzyskać więcej informacji na temat zmiany katalogów za pomocą wywołań systemowych POSIX.


Jak wszyscy powiedzieli, ~jest rozszerzany przez powłokę, zanim ścieżka zostanie użyta do czegokolwiek. Użycie ~/bin/myprogw skrypcie powłoki sprawi, że będzie działać inaczej dla różnych użytkowników. Różnica między ~/bin/fooi /home/peter/bin/foopolega na tym, że jeden z nich na stałe zakodował lokalizację, a drugi sparametryzował ją. Błędem jest nazywanie ~wersji ścieżką względną (IMO) .

Mówienie o tym, że rzeczy są „względne względem zmiennej środowiskowej”, jest po prostu mylące. Złą praktyką jest używanie różnych anglojęzycznych znaczeń terminów, które mają określone znaczenie techniczne w kontekście, w którym je używasz.

W uszkodzonym systemie, z HOME=a/relative/path, ~/foorozwinąłby się do ścieżki względnej. To nie byłby w ogóle użyteczny zestaw.


3
Dziękuję za tę odpowiedź, wydaje mi się ona najbardziej wyczerpująca. Mam również wrażenie, że autor błędnie pomieszał pojęcie kanonicznej ścieżki z tym (o czym autor nigdzie nie wspomina). /opt/kde3/bin/../libna przykład jest błędnie sklasyfikowany jako ścieżka względna: jest ścieżką absolutną, ale nie kanoniczną. Jak już powiedziałeś, wszystko to powoduje zamieszanie, więc dziękuję za wyjaśnienia i informacje związane z NFS :)!
WhiteWinterWolf

1
Muszę dojść do wniosku, że pisanie książki przygotowującej do testu nie jest dobrą zabawą i że ludzie, którzy używają po prostu Unixa lub GNU / Linuksa do codziennej pracy, nie piszą tych książek. Ten przykład nazywania niekanonicznego krewnego wydaje mi się naprawdę zły i oczywisty. man7.org/linux/man-pages/man3/realpath.3.html (i realpath(1)) robią obie rzeczy: kanonizują i czynią absolutną (jak również podążają za dowiązaniami symbolicznymi), więc być może pojawiło się zamieszanie.
Peter Cordes,

2
Mimo to są to dla mnie zwykłe codzienne koncepcje. Myślę, że byłoby dziwnie mieć kawałek papieru, który powiedziałby, że je znam ... Powodzenia w zdobyciu kawałka papieru, @WhiteWinterWolf, aby pokazać wszystkim ludziom, którzy lubią patrzeć na kawałki papieru. :)
Peter Cordes,

48

Jest to zasadniczo pytanie dotyczące definicji terminów. Więc dla twoich celów odpowiedzią jest wszystko, czego chce LPIC. Ale możemy dojść do pewnych wniosków na podstawie faktów technicznych:

Jeśli przeszedłeś '~/Documents'do wywołania systemowego , szukałby katalogu o nazwie dokładnie ~w bieżącym katalogu (i prawdopodobnie się nie powiedzie). Zatem przez pojęcie nazw ścieżek używanych przez jądro jest to ścieżka względna - ale nie o to nam chodziło.

~Składnia jest realizowany przez powłoki (i innych programów, które imitują go dla wygody), który rozszerza się w prawdziwą ścieżkę. Zilustrowanie tego ~/Documentsjest w przybliżeniu tym samym, co $HOME/Documents(ponownie, składnia powłoki). Ponieważ $HOMEpowinna to być ścieżka bezwzględna, wartość $HOME/Documents jest również ścieżką bezwzględną. Ale tekst $HOME/Documentslub ~/Documentsmusi zostać rozwinięty przez powłokę, aby stać się ścieżką, którą mamy na myśli.

Dlatego gdybym chciał być precyzyjny i konsekwentny, powiedziałbym, że ~/Documentsjest to fragment skryptu powłoki, który rozwija się do ścieżki absolutnej.


Oczywiście jądro nie miałoby pojęcia, co to $HOMEznaczy, podobnie jak nie ma pojęcia, co ~to znaczy. Uważam jednak, że twierdzenie, że ~ jest rozszerzane przez powłokę, jest wątpliwe; większość aplikacji obsługuje to, co wskazuje raczej na bibliotekę C niż na powłokę. Rozszerzanie zmiennych środowiskowych jest jednak cechą powłoki; możesz otworzyć ~/somefile.odtw LibreOffice, ale nie $HOME/somefile.odt, nawet jeśli LibreOffice został uruchomiony z powłoki, w której $ HOME jest poprawnie ustawiony.
CVn

5
Możesz uważać to za wątpliwe, czego chcesz, ale jest udokumentowane i powinno być łatwe do potwierdzenia lub obalenia w C.
Bezużyteczne

6
Inne programy implementują ~składnię naśladując powłokę, ponieważ jest to przydatny skrót. Nie wiem, czy istnieje funkcja biblioteczna, która dokonuje rozszerzenia, ale zdecydowanie jest to coś, co jest robione oddzielnie od faktycznego używania nazwy ścieżki.
Kevin Reid,

2
globi wordexpmiędzy innymi rozszerzaj tyldy.
o11c,

2
@ MichaelKjörling: Kilka programów implementuje ~rozszerzenie; większość nie. Na przykład, jeśli wpiszesz ls -l ~, lsprogram nigdy nie zobaczy ~znaku; jest rozszerzany przez powłokę przed lswywołaniem. Jeśli faktycznie przejść ~do ls, nie będzie traktował go specjalnie; spróbuj ls -l '~'' (który spróbuje wyświetlić plik o nazwie dosłownie ~).
Keith Thompson,

16

Jeśli twoje $HOMEznaczy /home/white/, ~/Documents(tak samo jak $HOME/Documents) jest rozszerzany przez powłokę (patrz tutaj o wyjaśnienie) do /home/white/Documents, która jest absolutna ścieżka.

Ścieżka względna to taka, która nie zaczyna się od /(po rozwinięciu powłoki), np. ../DocumentsLubfoo/bar

Niektóre stare powłoki nie rozszerzać ~(Droga bash, tcsh, zshitd ... zrobić); widzieliby ~/Documentsjako ścieżkę względną zaczynającą się od ~; ale zwykle nie masz takiej nazwy katalogu ~(ale możesz ją utworzyć mkdir '~', co nie jest zalecane).


powinieneś wspomnieć, które pociski nie rozszerzają się~
Edward Torvalds,

3

An bezwzględna ścieżka rozpoczyna się /(czego dotyczy jest stała), a ścieżka względna rozpoczyna się w bieżącym katalogu (a więc to, co odnosi się do zmian jak aktualne zmiany katalogów). Większość powłok używa ~na początku jako skrót do bezwzględnej ścieżki do katalogu domowego bieżącego użytkownika, tzn. ~/DocumentsJest to katalog Documentsw domu bieżącego użytkownika, niezależnie od tego, jaki może być bieżący katalog. Jest to więc ścieżka absolutna.


1

Ścieżka może rozwinąć się w inne miejsce w zależności od tego, kim jest użytkownik. To powiedziawszy, moim zdaniem jest to wciąż ścieżka absolutna, a nie względna. Nie sądzę jednak, aby definicje ścieżki absolutnej i względnej były tak precyzyjnie zdefiniowane. To nie jest matematyka. Moim zdaniem to pytanie tak naprawdę nie sprawdza zrozumienia i jest bezcelowe.


Definicja to znacznie więcej niż opinia. Wikipedia zajmuje się tym w przypadku ogólnej sprawy, nie tylko Unix: en.wikipedia.org/wiki/…
Peter Cordes

1

Użycie ~ / na początku sprawia, że ​​ścieżka jest absolutna, ponieważ (z dowolnej definicji) możliwość znalezienia dokumentów nie zależy od tego, gdzie się aktualnie znajdujesz. Jednak ekspansja jest wykonywana przez powłokę, a nie jądro, więc jeśli używasz powłoki, która nie rozpoznaje tej składni (takiej jak / bin / sh, oryginalna powłoka Bourne'a, a nie alias bash), będziesz poza szczęście.

Co ciekawe, jeśli używasz ~ root / zamiast ~ /, optymalizacja odczytu $ HOME zwykle nie ma zastosowania i zawsze rozwiąże się do wartości absolutnej, jeśli / etc / passwd jest poprawne.


-1

Książka wydaje się przyjmować pogląd, że ścieżka bezwzględna to każda ścieżka rozpoczynająca się od /, a ścieżka względna to cokolwiek innego.

Możesz przeglądać ..i $HOMEjako podobne typy tokenów. Oba muszą zostać zastąpione komponentem ścieżki, zanim ścieżka zmieni się w ścieżkę bezwzględną.


3
Jak jest ..coś podobnego $HOME? ..może znajdować się na początku ścieżki przekazywanej bezpośrednio do wywołania systemowego, nie wymaga rozszerzenia powłoki. Taka ścieżka nie jest ścieżką absolutną; jest nadal względny w stosunku do lokalizacji cwd lub lokalizacji dowiązania symbolicznego. Chyba że autor próbował cię złapać, mówiąc o tym dosłownym ciągu (bez rozszerzenia powłoki) jako ścieżce. Myślę, że próbujesz znaleźć usprawiedliwienie dla tej książki, ale jestem bardziej skłonny po prostu powiedzieć, że jest źle i nie pozwolić, aby wszystko się zagmatwało.
Peter Cordes,
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.