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 ~/Documents
es 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 $HOME
Variablen oder in den Pfad des aktuellen Benutzer-Ausgangsverzeichnisses (vgl. man bash
) Erweitert werde. Der tatsächliche Pfad ist also in /home/myuser/Documents
der 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/../lib
der 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 $HOME
nur 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?
/
, 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.~/foo
einen relativen Pfad zu nennen. Worauf es ankommt, ist der Unterschied zwischen Hardcodierung und Parametrisierung. Siehe meine Antwort für weitere Details.~/Documents
und$HOME/Documents
keine 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.Antworten:
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.2
vs.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.BDebian installiert manchmal Symlinks
../../doc/whatever/whatever
anstelle eines absoluten Symlink-Ziels, so dass es funktioniert, wenn NFS an einer anderen Stelle eingebunden wird oder wenn eine Chroot betrachtet wird, ohne daraufchroot(8)
zuzugreifen.Jeder Unix-Prozess hat eine eigene cwd. Der
pwd
Befehl 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/myprog
in einem Shell-Skript führt dazu, dass es für verschiedene Benutzer unterschiedlich funktioniert. Der Unterschied zwischen~/bin/foo
und/home/peter/bin/foo
besteht 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
,~/foo
würde zu einem relativen Pfad erweitern. Dies wäre überhaupt kein brauchbares Setup.quelle
/opt/kde3/bin/../lib
zum 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 :)!realpath(1)
absolut machen (sowie Symlinks folgen), so dass sich möglicherweise einige Verwirrung einschleicht.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~/Documents
ist ungefähr dasselbe wie$HOME/Documents
(wiederum Shell-Syntax). Da$HOME
ein absoluter Pfad sein soll, ist der Wert von$HOME/Documents
auch ein absoluter Pfad. Aber der Text$HOME/Documents
oder~/Documents
muss 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
~/Documents
ist ein Fragment von Shell-Skript , das zu einem absoluten Pfad erweitert.quelle
$HOME
bedeutet, 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.odt
in LibreOffice öffnen , aber nicht$HOME/somefile.odt
, selbst wenn LibreOffice über eine Shell gestartet wurde, in der $ HOME ordnungsgemäß festgelegt ist.~
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.glob
undwordexp
Tilde Expansion unter anderem.~
Erweiterung; die meisten nicht. Wenn Sie beispielsweise etwas eingebenls -l ~
,ls
sieht das Programm das~
Zeichen nie . Es wird von der Shell erweitert, bevorls
es aufgerufen wird. Wenn Sie ein an tatsächlich übergeben~
,ls
wird es nicht speziell behandelt; tryls -l '~
'`(das versucht, eine Datei mit dem wörtlichen Namen aufzulisten~
).Wenn Ihr
$HOME
ist/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../Documents
oderfoo/bar
Einige alte Muscheln nicht erweitern
~
(die Art und Weisebash
,tcsh
,zsh
etc. ... tun); sie würden~/Documents
als einen relativen Pfad sehen, der mit beginnt~
; aber du hast normalerweise keinen verzeichnisnamen wie~
(aber du könntest einen mit erstellenmkdir '~'
, was ich nicht empfehle).quelle
~
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~/Documents
ist das VerzeichnisDocuments
im Ausgangsverzeichnis des aktuellen Benutzers, unabhängig davon, welches das aktuelle Verzeichnis sein könnte. Es ist also ein absoluter Weg.quelle
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.
quelle
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.
quelle
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$HOME
als ähnliche Arten von Token anzeigen . Beide müssen für eine Pfadkomponente ersetzt werden, bevor der Pfad in einen absoluten Pfad aufgelöst wird.quelle
..
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.