
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 (vonman 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
dir
auchdir/
und fügen/
bei Bedarf hinzu, beispielsweise um auf eine Datei darin zu verweisendir
.
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 source
und würde target
der Befehl rsync -a source target
alles nach kopieren target/source
. Mit einem abschließenden Schrägstrich rsync -a source/ target
wird der Inhalt von jedoch direkt source
nach kopiert target
, ohne ein target/source
Unterverzeichnis 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. nginx
Wenn für einen Ort der angegeben wird root
, macht es keinen Unterschied, da nginx
weiß, 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_uri
das Umschreiben oder Proxying tun).
Im Allgemeinen macht es keinen Unterschied, wenn es um *nix-Plattformen geht. Es gibt einige Ausnahmen:
rsync
verhä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.