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 ~/Documents
jest 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 $HOME
zmiennej lub bieżącej ścieżki katalogu domowego użytkownika (porównaj man bash
), więc rzeczywista ścieżka jest /home/myuser/Documents
katalogiem 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/../lib
któ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/Documents
może po prostu $HOME
nie 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ę?
/
, 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.~/foo
ścieżki względnej. Dostajesz różnicę między kodowaniem na stałe a parametryzacją. Zobacz moją odpowiedź, aby uzyskać więcej informacji.~/Documents
i$HOME/Documents
nie 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.Odpowiedzi:
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.2
vs.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ładDebian 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 bezchroot(8)
wchodzenia w niego.Każdy proces uniksowy ma swój własny plik cwd.
pwd
Komenda 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/myprog
w skrypcie powłoki sprawi, że będzie działać inaczej dla różnych użytkowników. Różnica między~/bin/foo
i/home/peter/bin/foo
polega 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
,~/foo
rozwinąłby się do ścieżki względnej. To nie byłby w ogóle użyteczny zestaw.źródło
/opt/kde3/bin/../lib
na 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 :)!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.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~/Documents
jest w przybliżeniu tym samym, co$HOME/Documents
(ponownie, składnia powłoki). Ponieważ$HOME
powinna to być ścieżka bezwzględna, wartość$HOME/Documents
jest również ścieżką bezwzględną. Ale tekst$HOME/Documents
lub~/Documents
musi 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
~/Documents
jest to fragment skryptu powłoki, który rozwija się do ścieżki absolutnej.źródło
$HOME
znaczy, 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.odt
w LibreOffice, ale nie$HOME/somefile.odt
, nawet jeśli LibreOffice został uruchomiony z powłoki, w której $ HOME jest poprawnie ustawiony.~
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.glob
iwordexp
między innymi rozszerzaj tyldy.~
rozszerzenie; większość nie. Na przykład, jeśli wpiszeszls -l ~
,ls
program nigdy nie zobaczy~
znaku; jest rozszerzany przez powłokę przedls
wywołaniem. Jeśli faktycznie przejść~
dols
, nie będzie traktował go specjalnie; spróbujls -l '~
'' (który spróbuje wyświetlić plik o nazwie dosłownie~
).Jeśli twoje
$HOME
znaczy/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.../Documents
Lubfoo/bar
Niektóre stare powłoki nie rozszerzać
~
(Drogabash
,tcsh
,zsh
itd ... zrobić); widzieliby~/Documents
jako ś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).źródło
~
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.~/Documents
Jest to katalogDocuments
w domu bieżącego użytkownika, niezależnie od tego, jaki może być bieżący katalog. Jest to więc ścieżka absolutna.źródło
Ś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.
źródło
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.
źródło
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$HOME
jako podobne typy tokenów. Oba muszą zostać zastąpione komponentem ścieżki, zanim ścieżka zmieni się w ścieżkę bezwzględną.źródło
..
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.