Sollte eine Verzeichnispfadvariable mit einem abschließenden Schrägstrich enden?

85

Sollte ein Pfad zu einem Verzeichnis als Variable oder Konstante mit einem abschließenden Schrägstrich enden? Was ist die Konvention?

pwdIn 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.

meleyal
quelle

Antworten:

23

Ich füge den abschließenden Schrägstrich nicht ein, wenn ich beispielsweise ein Verzeichnis zum Speichern von Dateien definiere. Das liegt daran, dass ich es gerne benutzen werde

$store_file = "$store_path/$file_id";

Ich werde immer einen abschließenden Schrägstrich hinzufügen, bevor ich eine Variable verwende, die einen Verzeichnispfad enthalten soll. Ich denke, es ist besser, immer einen hinzuzufügen, als sich zu fragen, ob der abschließende Schrägstrich enthalten ist.

Johan Soderberg
quelle
28
Wenn kein abschließender Schrägstrich vorhanden ist, ist unklar, ob der Pfad in $ store_path eine Datei oder ein Verzeichnis ist. "/ tmp / store_data" ist es eine Datei oder ein Verzeichnis?
Darwin
4
Wenn Sie so etwas wie die realpath () - Funktion von PHP verwenden, wird der abschließende Schrägstrich nicht gedruckt. Ihr System und Ihre Tools können Ihre Konvention bestimmen.
jmbertucci
9
Wenn Sie irgendwo mehrere Schrägstriche haben, wird dies normalerweise als einzelner Schrägstrich interpretiert. Sie könnten also sogar so etwas haben '///' + $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 , '/' + $rootanstatt , $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.
Xtrinity
3
@ MatthewSlyman, mein Punkt war, dass jeder erwartet, dass dies /tmp/store_data/ein Verzeichnis ist, während es unklar ist, was der gleiche Weg ohne einen Traling-Schrägstrich ist/tmp/store_data
Darwin
5
Das Problem dabei ist: Wenn eine Variable nicht vorhanden ist, ist sie dieselbe wie leer, und eine rm -rf $foo/$barDose rm -rf /
endet
99

Ich gehe mit dem nachgestellten Schrägstrich, weil:

  1. "Wenn es mit einem Schrägstrich endet, ist es ein Verzeichnis. Wenn nicht, ist es eine Datei." ist eine leicht zu merkende Konvention.

  2. 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.

Dave Sherohman
quelle
9
Ein Verzeichnispfad unterscheidet sich nur von einem Dateipfad, wenn der Verzeichnispfad einen abschließenden Schrägstrich aufweist.
Darwin
4
Mehrere Schrägstriche entsprechen einem Schrägstrich, es sei denn, der Pfad beginnt mit einem doppelten Schrägstrich. Siehe unix.stackexchange.com/questions/1910/…
jdh8
4
Das Hinzufügen eines Schrägstrichs am Ende von vaariable ermöglicht "$ path $ file" anstelle von "$ path / $ file", wodurch ein leerer $ path - dh das aktuelle Arbeitsverzeichnis - zugelassen wird. Verwenden Sie jedoch niemals einen Schrägstrich anstelle eines Schrägstrichs.
fantastisch
Dateideskriptoren sind auch nützlich
Francesco Gualazzi
@ jdh8 Auch wenn der Pfad mit doppelten Schrägstrichen beginnt, sollte er dennoch einem Schrägstrich entsprechen. Dies kann sich jedoch von Implementierung zu Implementierung ändern. Die Unix-Standards besagen, dass 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.
Xtrinity
11

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 von ls, 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 als ls /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 *_DIRWerts 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

Der Inode (Indexknoten) ist eine Datenstruktur in einem Unix-Dateisystem, die ein Dateisystemobjekt wie eine Datei oder ein Verzeichnis beschreibt.

- 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

Karl Wilbur
quelle
Hervorragende Antwort. Ich habe diesen Ansatz eher verwendet, war aber nie ganz vollständig, warum. Dies ist die einzige Antwort, die es nagelt.
Wardw
3
Es ist die Wurzel /, 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.
Wardw
Aha. Hat ein bisschen mit dirname gespielt. Wenn Sie ein Verzeichnis explizit in einem Pfad speichern möchten, beenden Sie den Pfad mit einem „/.“, Wobei der Punkt das aktuelle Verzeichnis darstellt.
TamusJRoyce
Du würdest niemals mit einem enden /., 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.
Karl Wilbur
2
@wardw Sie können sich das Stammverzeichnis als leere Zeichenfolge vorstellen, während "/" eine leere Zeichenfolge gefolgt von einem Schrägstrich ist und "den Inhalt des Stammverzeichnisses" bedeutet.
Bobpaul
9

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).

PaulJWilliams
quelle
5
.. und wenn Sie es nicht berücksichtigen, bedeutet dies, dass Sie möglicherweise versehentlich mit /
herumspielen
5

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):

$fullPath = rtrim($directory, '/') . '/filename.txt');

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.

Paul F.
quelle
5

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.

jerryjvl
quelle
Python:os.path.join(dir, subdir_or_file)
IceArdor
4

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 /filenamenicht 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.

DanMan
quelle
1
Die Alternative hier ist, Ihren Dateinamen als auszudrücken ./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.
Wardw
4

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.

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

Ü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.

Basilikum Musa
quelle
2
Eine Ausnahme: dirname ('/ test') = '/' - anstatt eine leere Zeichenfolge zurückzugeben, gibt dirname in diesem Fall einen einzelnen Schrägstrich zurück! Siehe die Notizen hier .
Matthew Slyman
3

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

James
quelle
2

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.

maxp
quelle
1

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.

Bevan
quelle
0

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/FSObjectXeindeutig 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?

MrCalvin
quelle