Ich schreibe eine Bibliothek zur Bearbeitung von Unix-Pfadzeichenfolgen. In diesem Fall muss ich einige dunkle Ecken der Syntax verstehen, über die sich die meisten Menschen keine Sorgen machen würden.
Zum Beispiel, so gut wie ich sagen kann, scheint es , dass foo/bar
und foo//bar
beide auf die gleiche Stelle.
Auch ~
in die Regel steht für den Home - Verzeichnis des Benutzers, aber was , wenn es in der erscheint Mitte eines Weges? Was passiert dann?
Diese und einige Dutzend andere obskure Fragen müssen beantwortet werden, wenn ich Code schreiben möchte, der jeden möglichen Fall korrekt behandelt. Kennt jemand eine endgültige Referenz, die die genauen Syntaxregeln für dieses Zeug erklärt?
(Leider werden bei der Suche nach Begriffen wie "Unix-Pfadsyntax" nur eine Million Seiten mit der $PATH
Variablen angezeigt ... Ich habe sogar Probleme, geeignete Tags für diese Frage zu finden!)
~
) wird in Wie Linux mit mehreren Pfadtrennzeichen (/ home //// Benutzername /// Datei) umgeht behandelt . Das, was einer normativen Referenz am nächsten kommt, ist die POSIX- oder Single Unix-Spezifikation - nicht einfach zu lesen.Antworten:
Es gibt drei Arten von Pfaden:
foo
,foo/bar
,../a
,.
. Sie beginnen nicht mit/
und beziehen sich auf das aktuelle Verzeichnis des Prozesses, der einen Systemaufruf mit diesem Pfad ausführt./
,/foo/bar
oder///x
. Sie beginnen mit 1 oder 3 oder mehr/
, sind nicht relativ und werden ausgehend vom/
Stammverzeichnis nachgeschlagen .//foo
speziell behandelt werden, gibt jedoch nicht an, wie. Einige Systeme verwenden dies für spezielle Fälle wie Netzwerkdateien . Es müssen genau 2 Schrägstriche sein.Anders als zu Beginn wirken Schrägstrichsequenzen wie eine.
~
ist nur etwas Besonderes für die Shell , es wird durch die Shell erweitert, es ist überhaupt nichts Besonderes für das System. Wie es erweitert wird, hängt von der Shell ab. Shells führen andere Formen von Erweiterungen durch, z. B. globbing (*.txt
) oder variable Erweiterung/$foo/$bar
oder andere. Für das System ist~foo
es nur ein relativer Pfad wie_foo
oderfoo
.Dinge zu beachten:
foo/
ist nicht dasselbe wiefoo
. Es ist näherfoo/.
alsfoo
(insbesondere wennfoo
es sich um einen Symlink handelt) für die meisten Systemaufrufe auf den meisten Systemen (foo//
ist das gleiche wiefoo/
wenn).a/b/../c
ist nicht unbedingt dasselbe wiea/c
(zum Beispiel wenna/b
es sich um einen Symlink handelt). Am besten nicht..
speziell behandeln .a/././././b
dasselbe alsa/b
ob zu betrachten.quelle
/
,.
und..
(?)//foo
Behandlung ist Cygwin, wo es für UNC-Pfade verwendet wird . Das heißt, es//server/share/dir/file.txt
handelt sich um einen legalen Pfad, der standardmäßig auf das System verweist. Cygwin greift auf das lokale System zurück, wenn es nicht gefunden werden kannserver
.Ja. Dies ist häufig der Fall, weil Software manchmal einen Pfad verkettet, vorausgesetzt, der erste Teil wurde nicht mit einem Schrägstrich abgeschlossen, sodass einer eingeworfen wird, um sicherzugehen (was bedeutet, dass möglicherweise zwei oder mehr vorhanden sind).
foo///bar
und zeigen Siefoo/////bar
auch auf den gleichen Ort wiefoo/bar
. Eine nette Funktion für eine Pfadmanipulationsbibliothek wäre eine, die eine beliebige Anzahl von aufeinanderfolgenden Schrägstrichen auf eins reduziert (außer am Anfang eines Pfades, wo sie auf URL-artige Weise verwendet werden kann, oder, wie Stephane betont, für eine beliebige nicht näher bezeichneter Sonderzweck).Diese Transformation erfolgt über die Shell- und Tilde-Erweiterung , die nur funktioniert, wenn es sich um das erste Zeichen im Pfad handelt. Ob Sie sich damit befassen müssen oder nicht, hängt vom Kontext ab. Wenn die Bibliothek mit normalen Programmen verwendet werden soll, die z. B. Befehlszeilenargumente empfangen, die einen Pfad enthalten, wird die Tilde-Erweiterung bereits durchgeführt, wenn sie den Pfad sehen. Die einzige Situation, die ich als bedenklich erachte, ist, wenn Sie Pfade direkt aus einer Textdatei verarbeiten.
Darüber hinaus
~
ist es ein rechtlicher Charakter in einem * nix-Pfad und sollte nicht in etwas anderes geändert werden. Aus diesem/
Grund sind die einzigen Zeichen, die in einem Unix-Dateinamen nicht zulässig sind (weil es sich um das Pfadtrennzeichen handelt) und "null" (auch bekannt als Null-Byte), da sie im Text im Allgemeinen unzulässig sind.quelle
//
ist dies technisch auch nicht der Fall. Sowohl URLs als auch die neuere, laut SC frei mehrdeutige POSIX-Spezifikation für//
können von solchen abgeleitet worden sein. In diesem Fall scheint "URL-ish" eine passende Bezeichnung für die Konvention zu sein (selbst wenn UNCs älter sind und selbst wenn der Anschein besteht ist unbeabsichtigt). Ich würde niemals sagen, dass "sie URLs sind", nur das//
oder\\
einem "URL-ish" Zweck dient.