Ist ~ / Documents ein relativer oder ein absoluter Pfad?

37

Dies ist nur eine Frage des Wortschatzes, die sich in meinem Kopf ständig dreht.

Es stammt aus einer Übungsprüfung aus einem LPIC- Vorbereitungsbuch. Die richtige Antwort nach dem Buch ist, dass ~/Documentses sich um ein relatives Verzeichnis handelt, da es sich um das Basisverzeichnis handelt.

Dieses Buch enthält jedoch ein beachtliches Verhältnis von Tippfehlern und Fehlern, so dass ich nicht alles als selbstverständlich ansehen kann, was dort geschrieben steht. Hier stimme ich nicht zu, da ich ~als Variable durch die Shell entweder in den Inhalt der $HOMEVariablen oder in den Pfad des aktuellen Benutzer-Ausgangsverzeichnisses (vgl. man bash) Erweitert werde. Der tatsächliche Pfad ist also in /home/myuser/Documentsder Tat ein absolutes Verzeichnis.

Selbst Wikipedia scheint mir diesbezüglich einmal keine Hilfe zu sein (auch wenn es zu bestätigen scheint, dass das Buch in diesem Punkt falsch ist):

Ein absoluter oder vollständiger Pfad verweist auf denselben Speicherort in einem Dateisystem, unabhängig vom aktuellen Arbeitsverzeichnis. Dazu muss es das Stammverzeichnis enthalten.

Im Gegensatz dazu beginnt ein relativer Pfad bei einem bestimmten Arbeitsverzeichnis, sodass nicht der vollständige absolute Pfad angegeben werden muss.

Auch hier stimme ich nicht zu: Nach dieser Definition sollte der Pfad, /opt/kde3/bin/../libder nicht vom aktuellen Arbeitsverzeichnis abhängt, ein absoluter Pfad sein. Mein derzeitiges Verständnis entspricht jedoch dem Autor des Buches, der diesen Pfad zu einem relativen Pfad macht.

Eine schnelle Websuche trägt laut Webster Dictionary nur zu meiner Frustration bei :

absoluter Pfad - Ein Pfad relativ zum Stammverzeichnis. Das erste Zeichen muss das Pfadnamentrennzeichen sein.

Also $HOME/Documents, oder einfach $HOMEnur nicht als absolute Verzeichnisse gelten? Oder impliziert diese Definition eine variable Expansion? Was ist mit dem ~Charakter der Muschel ? Gibt es eine verlässliche Definition des relativen und des absoluten Verzeichnisses, die ich irgendwo finden kann, und irre ich mich auf dem ganzen Weg?

WhiteWinterWolf
quelle
7
Alle Pfade sind relativ, einige nur relativ zum Stammverzeichnis /, und die, die wir als absolut bezeichnen. Also alles , was beginnt /ich absolut nennen würde (auch wenn dies ist /usr/../etc) und alles andere würde ich rufen relativ ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Der Punkt ist, dass absolut unabhängig vom aktuellen Arbeitsverzeichnis oder aktuellen Benutzer funktionieren sollte. Verwandte können nur in bestimmten engen Fällen arbeiten.
8.
6
Der Pfad kann sich je nach Benutzer an einem anderen Ort befinden. Trotzdem ist dies meiner Meinung nach immer noch ein absoluter Weg, kein relativer Weg. Obwohl ich nicht denke, dass die Definitionen des absoluten und des relativen Pfades so genau definiert sind. Das ist keine Mathematik. Diese Frage prüft nicht wirklich das Verständnis, imo, und ist sinnlos.
Faheem Mitha
1
@FaheemMitha: LPIC ist eine verteilungsneutrale Linux-Zertifizierung. Die Zertifizierung selbst scheint in Ordnung zu sein, aber dies ist bei weitem nicht der Fall bei (zumindest einigen) Büchern, die verkauft wurden, um sich auf diese Prüfung als Selbststudium vorzubereiten ...
WhiteWinterWolf
2
@jimmij: "relative" hat im Zusammenhang mit Pfaden eine bestimmte technische Bedeutung, und die Verwendung eines anderen englischen Wortsinns ist eine schlechte Praxis. Ich bin überhaupt nicht damit einverstanden, ~/fooeinen relativen Pfad zu nennen. Worauf es ankommt, ist der Unterschied zwischen Hardcodierung und Parametrisierung. Siehe meine Antwort für weitere Details.
Peter Cordes
1
Die Definitionen des Webster Dictionary sind korrekt, aber sehr verwirrend. Dies impliziert jedoch, dass Zeichenfolgen wie ~/Documentsund $HOME/Documentskeine Pfade sind. Sie identifizieren (absolute) Pfade nach der Erweiterung, aber sie sind selbst keine Pfade. Ich denke, das stimmt mit der Anzahl der Unix / Linux-Benutzer überein, aber ohne Zweifel werden diese Zeichenfolgen auch selbst Pfade genannt.
reinierpost 10.08.15

Antworten:

41

Wenn der Autor versucht hat, Sie herauszufinden, indem er über diese Literalzeichenfolge (ohne Shell-Erweiterung) als Pfad gesprochen hat, ist dies ein relativer Pfad ( mkdir -p './~/Documents'). Andernfalls:


Dies ist ein absoluter Pfad , da die Auflösung nicht vom aktuellen Arbeitsverzeichnis des Prozesses abhängt. Relativer Pfad bedeutet immer relativ zum Arbeitsverzeichnis des Prozesses. Oder bei Symlink-Zielen relativ zur Position des Symlinks. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2). Dies gilt für NFS-Mount-Vorgänge und andere Fälle, in denen Sie über verschiedene absolute Pfade auf denselben Symlink zugreifen können. z.B

/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 installiert manchmal Symlinks ../../doc/whatever/whateveranstelle eines absoluten Symlink-Ziels, so dass es funktioniert, wenn NFS an einer anderen Stelle eingebunden wird oder wenn eine Chroot betrachtet wird, ohne darauf chroot(8)zuzugreifen.

Jeder Unix-Prozess hat eine eigene cwd. Der pwdBefehl existiert nur zum Drucken.

siehe: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html für mehr über Verzeichnisse mit POSIX - Systemaufrufe zu ändern.


Wie alle anderen gesagt haben, ~wird durch die Shell erweitert, bevor der Pfad für irgendetwas verwendet wird. Die Verwendung ~/bin/myprogin einem Shell-Skript führt dazu, dass es für verschiedene Benutzer unterschiedlich funktioniert. Der Unterschied zwischen ~/bin/foound /home/peter/bin/foobesteht darin, dass einer von ihnen den Ort fest codiert hat, während der andere ihn parametrisiert hat. Es ist ein Fehler (IMO), die ~Version als relativen Pfad zu bezeichnen.

Über Dinge zu sprechen, die "relativ zu einer Umgebungsvariablen" sind, ist nur verwirrend. Es ist eine schlechte Praxis, verschiedene englischsprachige Bedeutungen von Begriffen zu verwenden, die in dem Kontext, in dem Sie sie verwenden, bestimmte technische Bedeutungen haben.

Auf einem kaputten System, mit HOME=a/relative/path, ~/foowürde zu einem relativen Pfad erweitern. Dies wäre überhaupt kein brauchbares Setup.

Peter Cordes
quelle
3
Vielen Dank für diese Antwort, sie scheint mir die umfassendste zu sein. Ich habe auch den Eindruck, dass der Autor den Begriff des kanonischen Weges falsch verwechselt hat (den der Autor nirgends erwähnt). /opt/kde3/bin/../libzum Beispiel wird fälschlicherweise als relativer Pfad klassifiziert: Es ist ein absoluter Pfad, aber nicht der kanonische. Wie Sie sagten, macht dies alles nur verwirrend. Vielen Dank für Ihre Klarstellung und die Informationen zu NFS :)!
WhiteWinterWolf
1
Ich muss zu dem Schluss kommen, dass das Schreiben eines Testvorbereitungsbuchs keinen großen Spaß macht und dass Leute, die Unix oder GNU / Linux nur für ihre alltäglichen Computer verwenden, nicht diejenigen sind, die diese Bücher schreiben. Das Beispiel für ein eine nicht-canononical Pfad Aufruf relativ scheint wirklich schlecht und mir klar. (und ) tun beides: kanonisieren und realpath(1)absolut machen (sowie Symlinks folgen), so dass sich möglicherweise einige Verwirrung einschleicht.
Peter Cordes
2
Trotzdem sind das für mich nur gewöhnliche Alltagskonzepte. Ich denke, es wäre seltsam, ein Stück Papier zu haben, auf dem steht, dass ich sie kenne ... Aber viel Glück, dass Sie Ihr Stück Papier, @WhiteWinterWolf, allen Menschen zeigen, die sich gerne Papierstücke ansehen. :)
Peter Cordes
48

Dies ist im Wesentlichen eine Frage zur Definition von Begriffen. Für Ihre Zwecke lautet die Antwort also, was auch immer LPIC will. Wir können jedoch einige Schlussfolgerungen ziehen, die auf technischen Fakten beruhen:

Wenn Sie '~/Documents'einen Systemaufruf übergeben , wird nach einem Verzeichnis gesucht, das genau ~im aktuellen Verzeichnis angegeben ist (und wahrscheinlich fehlschlägt). Nach dem Begriff der vom Kernel verwendeten Pfadnamen ist dies ein relativer Pfad - aber das ist nicht das, was wir gemeint haben.

~ist Syntax implementiert durch die Schale (und andere Programme , die es der Bequemlichkeit halber imitieren) , die erweitert es in einen realen Pfad. Dies zu veranschaulichen ~/Documentsist ungefähr dasselbe wie $HOME/Documents(wiederum Shell-Syntax). Da $HOMEein absoluter Pfad sein soll, ist der Wert von $HOME/Documents auch ein absoluter Pfad. Aber der Text $HOME/Documentsoder ~/Documentsmuss durch die Shell erweitert werden, um der Weg zu werden, den wir meinen.

Also wenn ich präzise und konsequent sein will, würde ich sagen , dass ~/Documentsist ein Fragment von Shell-Skript , das zu einem absoluten Pfad erweitert.

Kevin Reid
quelle
Natürlich hätte der Kernel keine Ahnung, was es $HOMEbedeutet, genauso wie er keine Ahnung hat, was es ~bedeutet. Ich halte die Behauptung, daß die Shell eine Erweiterung vornehme, jedoch für zweifelhaft; Die meisten Anwendungen unterstützen dies, was eher auf die C-Bibliothek als auf die Shell verweist. Umgebungsvariable Expansion jedoch ist ein Merkmal der Schale; Sie können ~/somefile.odtin LibreOffice öffnen , aber nicht $HOME/somefile.odt, selbst wenn LibreOffice über eine Shell gestartet wurde, in der $ HOME ordnungsgemäß festgelegt ist.
ein Lebenslauf vom
5
Sie können es zweifelhaft alles , was Sie wollen finden, aber es ist dokumentiert und sollen leicht zu bestätigen oder zu widerlegen in C sein
Useless
6
Andere Programme implementieren die ~Syntax in Anlehnung an die Shell, da dies eine nützliche Abkürzung ist. Ich weiß eigentlich nicht, ob es eine Bibliotheksfunktion gibt, die die Erweiterung ausführt, aber es ist definitiv etwas, das separat von der tatsächlichen Verwendung des Pfadnamens durchgeführt wird.
Kevin Reid
2
globund wordexpTilde Expansion unter anderem.
o11c
2
@ MichaelKjörling: Einige Programme implementieren ~Erweiterung; die meisten nicht. Wenn Sie beispielsweise etwas eingeben ls -l ~, lssieht das Programm das ~Zeichen nie . Es wird von der Shell erweitert, bevor lses aufgerufen wird. Wenn Sie ein an tatsächlich übergeben ~, lswird es nicht speziell behandelt; try ls -l '~'`(das versucht, eine Datei mit dem wörtlichen Namen aufzulisten ~).
Keith Thompson
16

Wenn Ihr $HOMEist /home/white/, wird ~/Documents(wie $HOME/Documents) durch die Shell (siehe hier für eine Erklärung) zu erweitert /home/white/Documents, was ein absoluter Pfad ist.

Ein relativer Pfad beginnt nicht mit einem /(nach der Shell-Erweiterung), wie ../Documentsoderfoo/bar

Einige alte Muscheln nicht erweitern ~(die Art und Weise bash, tcsh, zshetc. ... tun); sie würden ~/Documentsals einen relativen Pfad sehen, der mit beginnt ~; aber du hast normalerweise keinen verzeichnisnamen wie ~(aber du könntest einen mit erstellen mkdir '~', was ich nicht empfehle).

Basile Starynkevitch
quelle
Sie sollten erwähnen, welche Muscheln sich nicht ausdehnen~
Edward Torvalds
3

Ein absoluter Pfad beginnt mit /(was sich darauf bezieht, ist fest), ein relativer Pfad beginnt mit dem aktuellen Verzeichnis (und was sich darauf bezieht, ändert sich, wenn sich das aktuelle Verzeichnis ändert). Die meisten Shells verwenden ~am Anfang als Abkürzung für den absoluten Pfad zum Ausgangsverzeichnis des aktuellen Benutzers, dh ~/Documentsist das Verzeichnis Documentsim Ausgangsverzeichnis des aktuellen Benutzers, unabhängig davon, welches das aktuelle Verzeichnis sein könnte. Es ist also ein absoluter Weg.

vonbrand
quelle
1

Der Pfad kann sich je nach Benutzer an einem anderen Ort befinden. Trotzdem ist dies meiner Meinung nach immer noch ein absoluter Weg, kein relativer Weg. Ich denke jedoch nicht, dass die Definitionen des absoluten und des relativen Pfades so genau definiert sind. Das ist keine Mathematik. Diese Frage prüft das Verständnis meiner Meinung nach nicht wirklich und ist sinnlos.

Faheem Mitha
quelle
Die Definition ist viel mehr als eine Meinung. Wikipedia versucht es für den allgemeinen Fall, nicht nur für Unix: en.wikipedia.org/wiki/…
Peter Cordes
1

Die Verwendung von ~ / am Anfang macht den Pfad absolut, da das Finden von Dokumenten (per Definition) nicht davon abhängt, wo Sie sich gerade befinden. Die Erweiterung wird jedoch von der Shell vorgenommen, nicht vom Kernel. Wenn Sie also eine Shell verwenden, die diese Syntax nicht erkennt (z. B. / bin / sh, die ursprüngliche Bourne-Shell, nicht der Bash-Alias), haben Sie keine Berechtigung mehr Glück.

Interessanterweise gilt bei Verwendung von ~ root / anstelle von ~ / die Optimierung des Lesens von $ HOME normalerweise nicht und wird immer in ein absolutes Ergebnis aufgelöst, wenn / etc / passwd korrekt ist.

jrrk
quelle
-1

Das Buch scheint die Ansicht zu vertreten, dass ein absoluter Pfad jeder Pfad ist, der mit a beginnt /, und ein relativer Pfad ist alles andere.

Sie können ..und $HOMEals ähnliche Arten von Token anzeigen . Beide müssen für eine Pfadkomponente ersetzt werden, bevor der Pfad in einen absoluten Pfad aufgelöst wird.

jl6
quelle
3
Wie ist so ..etwas $HOME? ..Kann am Anfang eines Pfades direkt an einen Systemaufruf übergeben werden, ist keine Shell-Erweiterung erforderlich. Ein solcher Weg ist kein absoluter Weg; Es ist immer noch relativ zum Prozess-CWD- oder Symlink-Speicherort. Es sei denn, der Autor hat versucht, Sie herauszufinden, indem er über diese wörtliche Zeichenfolge (ohne Shell-Erweiterung) als Pfad gesprochen hat. Ich denke, Sie versuchen, Ausreden für das Buch zu finden, aber ich bin eher geneigt zu sagen, dass es falsch ist und dass die Dinge nicht durcheinander geraten.
Peter Cordes