Sollte ein Pfad zu einem Verzeichnis als Variable oder Konstante mit einem abschließenden Schrägstrich enden? Was ist die Konvention?
pwd
In Unix wird Ihr aktuelles Verzeichnis ohne einen abschließenden Schrägstrich angezeigt, während die vollständige Registerkarte den abschließenden cd /var/www/apps/
Schrägstrich enthält, was mich unsicher machte.
'///' + $root + '//' + $file + '/'
und es wäre egal. Obwohl den Schrägstrich mit einem guten Weg ist , zu erkennen , ob der Pfad eine Datei oder ein Verzeichnis , es besser zu Wegen zu append sein würde ,'/' + $root
anstatt ,$root + '/'
wie Sie nicht positiv sein können , dass der Weg zu hat Slash einen nachgestellten angehängt wird Sie können jedoch relativ sicher sein, dass mehrere Schrägstriche in den meisten Umgebungen als ein einziger Schrägstrich interpretiert werden./tmp/store_data/
ein Verzeichnis ist, während es unklar ist, was der gleiche Weg ohne einen Traling-Schrägstrich ist/tmp/store_data
rm -rf $foo/$bar
Doserm -rf /
Ich gehe mit dem nachgestellten Schrägstrich, weil:
"Wenn es mit einem Schrägstrich endet, ist es ein Verzeichnis. Wenn nicht, ist es eine Datei." ist eine leicht zu merkende Konvention.
Zumindest auf den Betriebssystemen, die ich üblicherweise verwende, verursacht das Verdoppeln des Schrägstrichs keine Probleme, während das Weglassen des Schrägstrichs große Probleme verursacht. Es ist daher am sichersten, sowohl den Schrägstrich in die Variable einzufügen als auch "$ path / $ file" zu verwenden, wenn Sie ihn verwenden.
quelle
A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.
zum größten Teil beobachtet wurde, dass doppelte Schrägstriche in gängigen Implementierungen normalerweise als einzelner Schrägstrich interpretiert werden.Ich weiß, dass dies 10 Jahre alt ist, aber ich wollte meine sehr einfühlsamen $ 0,02 einwerfen.
Absolut nein.
Wir sprechen von einem Unix-System. In Bezug auf das Verzeichnis selbst ist es ein Knoten wie jeder andere. Wenn Sie in das Verzeichnis Bezug genommen wird , soll es nicht immer einen Unescaped Strich in seinem Namen hat (ref:
dirname
,pwd
,~
,echo $HOME
,echo $PATH
, die Ausgabe vonls
, et al).Wenn auf den Inhalt eines Verzeichnisses Bezug genommen wird , dann müssen Sie einen Schrägstrich. Das heißt,
ls /home/karl/
ist angemessener alsls /home/karl
(FTR, ich mache fast immer Letzteres, weil ... na ja, faul).Wenn Sie eine Variable verwenden, die ein Verzeichnis enthält, um den vollständigen Pfad zu einer Datei zu erstellen, müssen Sie immer den Schrägstrich (d. H. E :) einschließen
cp ${HOME}/test ${OTHER_DIR}/
.Es wird erwartet, dass ein Verzeichnis nicht mit einem Schrägstrich endet. Jede Erwartung, dass ein Verzeichnis mit einem Schrägstrich endet, ist falsch. Das Hinzufügen eines Schrägstrichs am Ende des
*_DIR
Werts einer Variablen würde also die Erwartungen untergraben.(Verweis aus Kommentaren: Dateipfad-Missverständnisse , von der Wikipedia-
Talk:Path_(computing)
Seite. Danke, John CJ )Es ist erwähnenswert, dass Tools / Pakete / Bibliotheken dies niemals tun, nur weil es falsch ist. Es kommt viel zu häufig vor, dass solche Dinge einen abschließenden Schrägstrich hinzufügen, wenn keiner existieren sollte. Wie Bevan und Paul F. beide vorgeschlagen haben, ist es daher am besten, bei Verwendung von Tools von Drittanbietern alle nachgestellten Schrägstriche zu entfernen, die möglicherweise in Verzeichnisnamen vorhanden sind.
Unix Inodes
- https://en.wikipedia.org/wiki/Inode
Dateisystem-Hierarchie-Standard
Der Standard für das Unix-Dateisystem (der Dateisystem-Hierarchiestandard, AKA FHS) zeigt deutlich, dass Verzeichnisse nicht mit einem abschließenden Schrägstrich versehen werden, sondern dass Verzeichnisinhalte mit einem Schrägstrich beginnen (die einzige Ausnahme hiervon ist,
/
dass wir nicht darauf verweisen das Dateisystem root mit einer leeren Zeichenfolge ... und man sollte dort sowieso nie Dateien erstellen.)- - http://www.pathname.com/fhs/pub/fhs-2.3.html
- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
quelle
/
, die das Muster bricht. Und wenn Sie Ihre Argumentation von hier aus (rekursiv) beginnen, können Sie zu den Widersprüchen gelangen, die den Kern der unterschiedlichen Praktiken bilden können (wie aus den Antworten hier hervorgeht). Aber sobald Sie dies als Ausnahme akzeptieren, fällt alles andere in Einklang./.
, das ist nur eine schreckliche Idee; Zusätzlich zum Einfügen sehr ungewöhnlicher Inhalte, die zu unerwarteten Problemen führen, sieht es einfach albern aus.Ja, es sollte als:
Pfadname + Dateiname = vollständig qualifizierter Dateispeicherort.
Daher muss der Schrägstrich zwischen dem letzten Verzeichnis und dem Dateinamen entweder am Ende des Pfadnamens oder am Anfang des Dateinamens stehen. Wenn Sie Dateinamen mit einem / voranstellen, müssen Sie dies berücksichtigen, wenn Sie nur eine Datei öffnen möchten (dh wenn Sie davon ausgehen, dass sich ein nicht qualifizierter Dateiname im aktuellen Arbeitsverzeichnis befindet).
quelle
Ich weiß, dass dies ein alter Thread ist, aber ich dachte, ich würde teilen, was ich tue. Wenn möglich, würde ich normalerweise beides zulassen und so etwas tun (wenn es PHP wäre):
Wenn das Verzeichnis in einer Konfigurationsdatei definiert ist, spielt es keine Rolle, ob die nächste Person, die es ändert, den abschließenden Schrägstrich enthält oder nicht.
quelle
Immer wenn ich Verzeichnispfade speichere oder von APIs zurückgebe, versuche ich, mich an die Konvention zu halten, einen abschließenden Schrägstrich beizubehalten. Dies vermeidet die ganze Mehrdeutigkeit "Ist es eine Datei oder ein Verzeichnis?".
Nachtrag :
Dies ist kein Ersatz für die Verwendung von Methoden, die entweder einen nachgestellten Schrägstrich oder dessen Fehlen tolerieren können. Selbst wenn ich diese Konvention verwende, verwende ich immer noch
Path.Combine(...)
ähnliche Methoden.quelle
os.path.join(dir, subdir_or_file)
Vielleicht sollten Sie darüber nachdenken, was Ihre Entscheidung für Dateien bedeuten würde. Wenn Sie den abschließenden Schrägstrich nicht am Ende eines Verzeichnisnamens einfügen, müssen Sie ihn am Anfang des Dateinamens hinzufügen .
Wenn nun aus irgendeinem Grund der Pfad zur Datei fehlt, wenn Sie Zeichenfolgen verketten, erhalten Sie so etwas wie
/filename
nicht nur eine Datei, sondern einen absoluten Pfad aus dem Stammverzeichnis (wo immer dies in diesem Kontext sein mag). .Deshalb beende ich meine Pfade mit einem Schrägstrich und behalte Dateien als Dateien.
quelle
./filename
. Im Allgemeinen sollte es jedoch in der Verantwortung des Codes liegen, die Pfade zu verketten, dies ordnungsgemäß zu tun - und keine Annahmen zu treffen.In PHP gibt die Funktion dirname (__ FILE __) den Verzeichnisnamen ohne Schrägstrich am Ende zurück. Ich neige dazu, mich an diese Konvention zu halten.
Andernfalls widerspricht die Verwendung eines Schrägstrichs am Ende eines Verzeichnisnamens der Funktionsweise von dirname (..), und Sie müssen die beiden Fälle nicht mehr behandeln, da Sie nicht wissen, ob der Verzeichnisname von einem dirnamen stammt (..). ) Funktion oder ein Inhalt, der mit einem abschließenden Schrägstrich definiert ist.
Fazit: Verwenden Sie keinen abschließenden Schrägstrich, da dirname (..) dies nicht tut.
Überprüfen Sie für andere Sprachen die Funktion, mit der ein Pfadname extrahiert wird, und prüfen Sie, ob ein abschließender Schrägstrich verwendet wird oder nicht. Halten Sie sich dann an die Konvention der Sprache.
quelle
Ich neige dazu, nur den abschließenden Schrägstrich hinzuzufügen, da ich dieses Verzeichnis höchstwahrscheinlich zum Hinzufügen / Abrufen von Dateien verwenden werde ...
In Bezug auf die Webreferenzierung kann die Leistung tatsächlich gesteigert werden, wobei der nachfolgende Schrägstrich erhalten bleibt
http://www.netmechanic.com/news/vol4/load_no11.htm
quelle
Ja, es gibt viele Dateisysteme, die Dateien ohne Erweiterungen unterstützen. Fügen Sie daher immer den abschließenden Schrägstrich hinzu, um Probleme zu vermeiden.
quelle
Ich habe noch nie eine feste Konvention gesehen.
Ziemlich sicher, dass, was auch immer Sie sich entscheiden, jemand anderes zu 100% sicher sein wird, dass es umgekehrt sein sollte. Die beste Idee ist es also, zu tolerieren, dass Dinge so oder so eingestellt werden.
In der .NET-Welt bietet Path.Combine () eine Möglichkeit, dies zu handhaben - in anderen Umgebungen gibt es Entsprechungen, ab Cmd-Dateien.
quelle
Ich denke, dies ist einer dieser seltenen Fälle, in denen die richtige theoretische und praktische Antwort unterschiedlich ist.
Es scheint, dass die Antwort von @Karl Wilbur im theoretischen Sinne sicher richtig ist, da Sie in der Lage sein sollten, einen Verweis auf den Verzeichnisknoten selbst vom Inhalt des Verzeichnisses zu unterscheiden.
Aber in der Praxis werde ich argumentieren, dass die richtige Antwort das Gegenteil ist:
Der wichtigste Grund ist, dass Sie mit Sicherheit feststellen können, dass der Pfad
/home/FSObjectX/
ein Ordner ist, während er nicht/home/FSObjectX
eindeutig ist. Niemand kann sagen, ob dies eine Ordnerdatei ist.Die Spezifikationen müssen nach Möglichkeit immer präzise und eindeutig sein.
In den allermeisten Fällen verweisen Sie immer auf den Inhalt eines Ordners, nicht auf den Verzeichnisknoten selbst.
In den seltenen Fällen, in denen Sie dies tatsächlich tun, kann dies einfach im Code behandelt werden, indem ein optionales nachfolgendes Verzeichnistrennzeichen entfernt wird.
Die Verwendung von Doppel-Trennzeichen schadet nicht, obwohl das Fehlen eines Trennzeichens mit Sicherheit der Fall ist.
Theoretisch ist dies ein schlechtes Argument, da Sie nicht zufällig codieren sollten. In der Praxis treten jedoch Fehler auf, und die Verwendung von Trailing Dir-Sep führt möglicherweise dazu, dass ein Endbenutzer weniger Laufzeitfehler hat.
Beim Lesen dieses interessanten Threads habe ich keine Nachteile bei der Verwendung von Trailing Dir-Sep festgestellt, nur dass es theoretisch falsch ist. Oder habe ich etwas verpasst?
quelle