it-swarm.com.de

Ist ~ / Mary ein relativer Weg?

Nehmen wir an, Mary ist ein Verzeichnis. Ist der folgende Pfad ~/Mary relativ?

36
Alex

Nein, es ist nicht relativ.

Es ist ein vollständiger Pfad, wobei ~ Ein Alias ​​ist.

Relative Pfade beschreiben einen Pfad in Bezug auf Ihren aktuellen Verzeichnisspeicherort. ~/Mary Ist jedoch genau das gleiche, unabhängig davon, in welchem ​​Verzeichnis Sie sich gerade befinden.

Angenommen, Sie sind derzeit als Bob und auch im Verzeichnis /home/Bob Eingeloggt, dann wäre ../Mary Ein Beispiel dafür ein relativer Pfad zu /home/Mary. Wenn Sie sich derzeit in /etc/something Befanden, wäre ~/Mary Immer noch /home/Bob/Mary, Aber ../Mary Wäre jetzt /etc/Mary.

Beachten Sie, dass Bash ~ Auf bestimmte Weise behandelt und nicht immer in $HOME Übersetzt wird.

Weitere Informationen finden Sie unter

73
EightBitTony

Wenn dieses ~/Mary Ein Pfad ist, der einem Systemaufruf gegeben wird (wie open(), stat()...), dann ist es ein relativer Pfad, es ist der Mary Eintrag in Bezug auf das Verzeichnis ~ im aktuellen Verzeichnis. Wenn Ihr aktuelles Verzeichnis beispielsweise /tmp Ist, ist dies die Datei /tmp/~/Mary.

Wenn jedoch ~/Mary In einer Shell (oder einem anderen Tool), das die Tilde-Erweiterung unterstützt, ohne Anführungszeichen verwendet wird, wird ~ Durch den Inhalt der Variablen $HOME Ersetzt ( Wenn es gesetzt ist) und da $HOME normalerweise einen absoluten Pfad wie /home/me enthält, wird ~/Mary auf /home/me/Mary erweitert, also auch ein absoluter Pfad.

Wenn Sie $HOME In einen relativen Pfad ändern (aber das möchten Sie nicht), wird ~/Mary Von der Shell zu einem relativen Pfad erweitert:

$ HOME=..; echo ~/Mary
../Mary

Wenn Sie es in //foo Ändern (oder wenn Ihr Ausgangsverzeichnis / War, was früher für root üblich war), wäre die Erweiterung von ~/Mary weder ein absoluter Pfadname noch ein relativer Pfadname (zumindest gemäß den POSIX-Definitionen).

Mit bash -Versionen vor 4.0 können Sie sogar lustige Dinge tun wie:

$ HOME='*' bash-3.2.48 -c 'cd /; echo ~/mount'
bin/mount run/mount

(das wurde in 4.0 behoben)

Weitere Infos zu nix & Linux at

50

Lass uns pedantisch werden.

Wie andere gesagt haben, ist es ein Alias; als solches ist es streng genommen weder ein absoluter noch ein relativer Pfad. Praktisch ist es ein absoluter Pfad, da er nicht relativ zum Arbeitsverzeichnis ist.

Nun zu den Details. Auf Betriebssystemebene werden Aliase nicht unterstützt, daher gilt die Regel, dass alle absoluten Pfade mit einem Schrägstrich beginnen, und alles andere ist ein relativer Pfad. Anwendungen geben jedoch möglicherweise nicht nur den Namen an den Kernel weiter: Die spezielle Behandlung von :, ~ Und - Ist üblich und anwendungsabhängig. - Wird zum Starten von Optionen verwendet, um sicherzustellen, dass Sie einen relativen Pfad verwenden. Sie können ./ Vorstellen, um in fast allen Fällen die relative Behandlung zu erzwingen (soweit ich weiß, ist die einzige Ausnahme ein Hostname enthält in einigen Implementierungen von rcp oder scp) einen Schrägstrich. Die Erkennung von : Wird zum Erkennen von URLs und Remote-Hosts für einige Befehle verwendet, und das Führen von // Hat in einigen Fällen ebenfalls eine besondere Bedeutung, aber alle diese Fälle sind Probleme auf Anwendungsebene, nicht auf Betriebssystemebene.

Fast alle Shells (ich kenne eine Ausnahme) und viele Unix-Anwendungen unterstützen die grundlegende Tilde-Erweiterung. Die beiden Tilde-Erweiterungen, die am wahrscheinlichsten funktionieren, sind ~/path (Wobei die führende Tilde durch den Inhalt der Variablen $HOME Ersetzt wird) und ~name/path (Wobei name wird in der Benutzerdatenbank nachgeschlagen, um das Ausgangsverzeichnis des Benutzers name zu finden. Funky wird es, wenn die Benutzerdatenbank keine absoluten Pfade enthält (tun Sie das nicht) oder $HOME Keinen absoluten Pfad enthält (tun Sie das auch nicht). Es können auch andere Formen der Tildexpansion existieren; Bash erweitert beispielsweise ~- auf das vorherige Arbeitsverzeichnis, wiederum alle auf Anwendungsebene (und die Shell ist eine Anwendung).

7
hildred

Die beiden am häufigsten bewerteten Antworten (EightBitTony und Stéphane) sind korrekt: ~ Ist ein Shell-Alias, der erweitert auf das Home-Verzeichnis des aktuellen Benutzers .

Auf jedem Unix-ähnlichen System werden die Home-Verzeichnisse der Benutzer in der Benutzerdatenbank als absolute Pfade angegeben (z. B. wird /etc/passwd Traditionell für lokale Benutzerkonten verwendet).

Einige der Antworten und Kommentare scheinen jedoch hinsichtlich der Definition der Begriffe absolut und relativ verwirrt zu sein, wobei einige an eine postmoderne Interpretation grenzen, die alle Pfade sind relativ (zu ihrem übergeordneten Verzeichnis oder zu /).


Definitionen aus den POSIX-Spezifikationen

Um etwas Klarheit zu schaffen, hielt ich es für nützlich, eine Antwort hinzuzufügen, die die Definitionen wie in The Open Group in POSIX.1-2008 (die Definitionen sind in Stéphanes Antwort verlinkt, aber nicht jeder folgt den Links):

Ein Pfadname wird angegeben als

Eine Zeichenfolge, mit der eine Datei identifiziert wird.

Ein absoluter Pfadname wird angegeben als:

Ein Pfadname, der mit einem oder mehr als zwei <slash> Zeichen beginnt

Ein relativer Pfadname wird angegeben als

Ein Pfadname, der nicht mit einem <slash> - Zeichen beginnt.

Wie eine POSIX-Shell den ~ Erweitert, ist in Tilde-Erweiterung angegeben.

4

Ja, ~/Mary ist ein relativer Weg.

Diese Frage scheint eine Frage der Definition zu sein. Ich bin nicht sicher, ob es eine offizielle systemweite Definition für absoluter Pfad und relativer Pfad gibt

Es gibt zwei Arten von 'Pfaden': relativ und absolut. Ein absoluter Pfad zeigt immer auf dieselbe Ressource. Relative Pfade verweisen auf eine Ressource relativ zu etwas anderem.

Wenn ~ verwendet wird, wird es normalerweise verwendet, um auf das aktuelle Benutzer-Ausgangsverzeichnis erweitert zu werden. Das Home-Verzeichnis hängt vom aktuellen Benutzer ab, daher ist ~/Mary relativ zum Home-Verzeichnis des aktuellen Benutzers.

Zum Beispiel kann ~/Mary Für Benutzer Bob auf /home/bob/Mary Und für Benutzer Alice auf /home/alice/Mary Erweitert werden.

Einige weitere Beispiele
./ Mary ist relativ zum aktuellen Verzeichnis
../ Mary ist relativ zum übergeordneten Verzeichnis
~/Mary ist relativ zum aktuellen Benutzer-Home-Verzeichnis
Mary ist relativ zum aktuellen Verzeichnis
/Mary ist relativ zum Stammverzeichnis. Das Stammverzeichnis ist fest, dies ist also ein absoluter Pfad

Es kann jedoch vorkommen, dass Benutzer behaupten, dass sogar ein Stammverzeichnis relativ zum aktuellen Host ist. Wenn Sie einem Pfad einen Host hinzufügen, wird dieser zu Hostname:/Mary. Dies ist jedoch immer noch kein absoluter Pfad, da 'Hostname' relativ zu dem System ist, das Hostnamen definiert.

2
anneb

Lassen Sie mich ein einfaches Experiment anbieten:

[[email protected] ~]$ cd /tmp
[[email protected] tmp]$ mkdir "~"
[[email protected] tmp]$ mkdir "~/Mary"
[[email protected] tmp]$ ls -al "~"
total 12
drwxrwxr-x.  3 vttoth vttoth   17 Oct 12 20:24 .
drwxrwxrwt. 14 root   root   8192 Oct 12 20:24 ..
drwxrwxr-x.  2 vttoth vttoth    6 Oct 12 20:24 Mary
[[email protected] tmp]$ cd "~/Mary"
[[email protected] Mary]$ pwd
/tmp/~/Mary

Sicher wie zum Teufel sieht relativ zu mir aus.

Wenn ich jedoch in der Bash-Shell (dasselbe gilt für viele andere Shells), tue ich das

[[email protected] Mary]$ echo ~
/home/vttoth

es wird offensichtlich, dass ~ wird von der Shell zu einem absoluten Pfad erweitert.

Kurz gesagt, die Frage ist nicht eindeutig: Die wörtliche Antwort lautet: "~/anything" ist ein relativer Pfad, aber man kann sich vorstellen, dass die Frage wirklich ist, wie die Shell das ~ Symbol, sofern es nicht durch Anführungszeichen vor Erweiterung geschützt ist.

Ich empfehle, den Abschnitt mit dem Titel Tilde-Erweiterung in der Bash-Manpage oder die entsprechenden Abschnitte in den Manpages der bevorzugten Shell zu lesen.

1
Viktor Toth