Unterschied zwischen dem Einfügen von / am Ende eines Verzeichnispfads und dem Weglassen

Unterschied zwischen dem Einfügen von / am Ende eines Verzeichnispfads und dem Weglassen

Ich frage mich nur, ob es einen Unterschied macht, was passiert, wenn ich / beispielsweise am Ende eines Dateipfads verlasse:

root /var/www/website.com/

Und wenn man es weglässt, etwa so:

root /var/www/website.com

Wie wird das gehandhabt bzw. gibt es da einen Unterschied?

Antwort1

Der abschließende Schrägstrich nach einem Verzeichnisnamen ist in manchen Programmen wichtig, in anderen nicht. Beispiel:

  • In Git /bedeutet Dateiname nur das Verzeichnis und nicht eine einzelne Datei (von man 5 gitignore):

    Wenn das Muster mit einem Schrägstrich endet, wird dieser für die Zwecke der folgenden Beschreibung entfernt, es wird jedoch nur eine Übereinstimmung mit einem Verzeichnis gefunden. Mit anderen Worten, foo/ wird mit einem Verzeichnis foo und den darunter liegenden Pfaden übereinstimmen, jedoch nicht mit einer normalen Datei oder einem symbolischen Link foo (dies entspricht der Art und Weise, wie pathspec im Allgemeinen in Git funktioniert).

  • In ls(vonWikipedia):

    Wenn eine Verzeichnisliste eines symbolischen Links angefordert
    wird, der auf ein Verzeichnis verweist, wird nur der Link selbst angezeigt. Um
    eine Liste des verknüpften Verzeichnisses zu erhalten, muss der Pfad
    ein Verzeichnistrennzeichen ('/', Schrägstrich) enthalten.

  • Einige andere Programme, an die ich mich jetzt nicht erinnern kann (hauptsächlich Emacs-Makros, die ich gesehen habe), die nur ein Verzeichnis und keine normale Datei erwarten, akzeptieren jedoch sowohl als dirauch dir/und fügen /bei Bedarf hinzu, beispielsweise um auf eine Datei darin zu verweisen dir.

Ich weiß nicht, wie nginx funktioniert, aber sehenMurus Antwort.

Antwort2

Im Allgemeinen ist ein Pfad ohne abschließenden Schrägstrich mehrdeutig: Es könnte sich entweder um eine Datei oder ein Verzeichnis handeln. Ein Pfad mit abschließendem Schrägstrich kann nur ein Verzeichnis sein. Die meisten Shells fügen den abschließenden Schrägstrich automatisch hinzu, wenn Sie die Tabulatorvervollständigung verwenden.

Das bedeutet nicht, dass Sie immer einen abschließenden Schrägstrich verwenden sollten; tatsächlich erlauben einige Programme seine Verwendung nicht. Wie die anderen bereits sagten, hängt es vom Kontext ab. Jedes Programm interpretiert dies anders.

Ein Beispiel, bei dem ein abschließender Schrägstrich einen großen Unterschied macht, ist rsync.

Bei den Verzeichnissen sourceund würde targetder Befehl rsync -a source targetalles nach kopieren target/source. Mit einem abschließenden Schrägstrich rsync -a source/ targetwird der Inhalt von jedoch direkt sourcenach kopiert target, ohne ein target/sourceUnterverzeichnis zu erstellen.

Dieses Verhalten verwirrt mich oft, daher verlasse ich mich nicht auf die implizite Erstellung von Unterverzeichnissen, sondern schreibe sie lieber aus. Manchmal verwende ich sogar ein Ende, /.um sicherzustellen, dass keine unerwünschten Unterverzeichnisse erstellt werden, da das Unterverzeichnis .bereits vorhanden ist.

Antwort3

Der Kontext ist wirklich wichtig. nginxWenn für einen Ort der angegeben wird root, macht es keinen Unterschied, da nginxweiß, dass es sich um ein Verzeichnis handelt. Es kann jedoch an anderer Stelle einen Unterschied machen, daDoppelte Schrägstriche können in URLs Probleme verursachen(das heißt, wenn Sie etwas wie blah/$request_uridas Umschreiben oder Proxying tun).

Im Allgemeinen macht es keinen Unterschied, wenn es um *nix-Plattformen geht. Es gibt einige Ausnahmen:

  • rsyncverhält sich unterschiedlich, je nachdem, ob der Quellverzeichnispfad einen abschließenden Schrägstrich hat oder nicht.Ein gutes Beispiel dafür, wie rsync abschließende Schrägstriche behandelt.
  • Durch das Hinzufügen eines abschließenden Schrägstrichs kann eine Anwendung darauf aufmerksam gemacht werden, dass sie nach einem Verzeichnis sucht, anstatt versehentlich eine Datei zu erstellen:

    cp blah non-existent-directory
    cp blah non-existent-directory2/
    
  • Ähnlich wie oben kann es beim Globbing verwendet werden, um die Erweiterung nur auf Verzeichnisse zu erzwingen:

    $ printf "%s\n" * | wc -l
    26
    $ printf "%s\n" */ | wc -l
    20
    

    Entschuldigen Sie das Beispiel. Es wird auf dem Stammverzeichnis einer ziemlich standardmäßigen Ubuntu-Installation ausgeführt, daher wurden bei der Ausführung dieses Beispiels keine seltsamen Namen beschädigt.

Antwort4

Wenn Sie in der Shell eingeben:

    CD-Pfad/somedir

Es verschiebt Ihr aktuelles Verzeichnis nachPfad/Somedir.
Wenn Sie jedoch Folgendes eingeben:

    cd-Pfad/somedir/

Es druckt:

    bash: cd: path/somedir/: Keine solche Datei oder kein solches Verzeichnis

Vielleicht liegt es daran, dass das /Zeichen bedeutet, dass der Pfad nicht vollständig ist, sondern weitergeht. Wenn Sie also nichts dahinter setzen, ist dies dasselbe wie der Verweis auf eine nicht vorhandene Datei.

verwandte Informationen