Sollte ich einen abschließenden Schrägstrich / in einen Symlink zu einem Verzeichnis einfügen?

30

Die Verknüpfung mit einem Verzeichnis führt zu unterschiedlichen Ergebnissen, ls -lje nachdem, ob ich ln -s diroder ln -s dir/. Aber was ist der eigentliche Unterschied und welchen sollte ich bevorzugen, warum?

Tobias Kienzler
quelle

Antworten:

9

Es gibt keinen Unterschied. (Es würde einen Unterschied geben, wenn das Ziel kein vorhandenes Verzeichnis wäre.)

Der letzte Schrägstrich ist möglicherweise aufgrund der Shell-Vervollständigung dort angekommen: Bei einigen Konfigurationen wird " ln -s tarTabSpacelinkto" abgeschlossen ln -s target/ link.

Gilles 'SO - hör auf böse zu sein'
quelle
Die verknüpfte Frage scheint sich auf mehrere aufeinanderfolgende Schrägstriche in Pfaden zu beziehen, nicht jedoch auf nachgestellte Schrägstriche in Links. Ich bin mir nicht sicher, ob es hier etwas zu sagen hat.
Mwfearnley
Eigentlich hätte ich das nicht sagen sollen. Es gibt einiges zu sagen über ein allgemeines Anliegen, das eng mit der Frage zusammenhängt. Ich denke aber nicht, dass es den ganzen Weg zu dieser Schlussfolgerung führt.
Mwfearnley
@mwfearnley Es ist eine logische Konsequenz: wenn foo -> bar/dann foo/quxgleichbedeutend mit bar//qux. Während der Titel der Frage formell nicht beinhaltet foo -> bar/, diskutiere ich diesen Fall auch in meiner Antwort dort.
Gilles 'SO- hör auf böse zu sein'
Hallo, danke für die Antwort. Es sagt mir, dass Pfade einschließlich Symlinks gleichwertig sind. Ich muss nicht unbedingt wissen, was passiert, wenn ich auf den Symlink selbst zugreife (ohne einen abschließenden Schrägstrich) und ohne Unix-Experte zu sein, was "Äquivalenz" bedeutet oder nicht bedeutet.
Mwfearnley
Da es mindestens einen Randfall gibt, bei dem es einen Unterschied macht, musste ich diese Antwort ablehnen.
Flimm
27

Das einzige, was mir einfällt, ist, dass es Sie vor jemandem "schützt", der das Verzeichnis löscht und eine Datei erstellt.

[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul    4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul    5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$

Die Version mit dem Schrägstrich bricht ab, wenn das Ziel durch eine Datei ersetzt wird.

Entwicklungswahnsinn
quelle
3

Interessante Frage. Ich habe einen kleinen Test gemacht:

$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov    3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov    4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
   79 trace_noslash
   79 trace_slash
$ diff -u trace_* | less

Wie Sie sehen, gibt es keinen Unterschied in der Anzahl der Systemaufrufe (zumindest für ls), und die Traces sehen sehr ähnlich aus. Dies ist jedoch nur ein Dump-Test, und ich bin nicht sicher, ob es Unterschiede gibt.

Wohnmobile
quelle
Ich frage mich auch, ob es tatsächlich einen Unterschied macht, aber warum sollte dieser zusätzliche Schrägstrich dann gespeichert werden?
Tobias Kienzler
2

Ihre Frage bezieht sich wirklich auf das Verhalten des lsProgramms.

1) Wenn Sie tun, ls -l $dirwo $ dir tatsächlich ein Symlink ist, erhalten Sie Informationen über den Symlink.

2) Wenn Sie tun, ls -lL $dirwo $ dir ein Symlink zu einem Verzeichnis ist, erhalten Sie Informationen über das Zielverzeichnis.

3) Wenn Sie dies tun ls -l $dir/., wird erzwungen, dass der Symlink befolgt wird, und es werden Informationen zum Zielverzeichnis bereitgestellt.

4) Wenn Sie dies tun ls -l $dir/, können die Ergebnisse in Abhängigkeit von der Version von 1 oder 3 identisch seinls verwendet wird. Ich war an eine ältere Version von Solaris gewöhnt, die es wie # 1 machte, und war überrascht, dass Linux es wie # 3 machte.

und welches soll ich warum bevorzugen?

Ohne einen abschließenden Schrägstrich, wenn Sie sich Sorgen machen müssen, ob es sich bei einem angegebenen Verzeichnisnamen um ein tatsächliches Verzeichnis handelt, und nicht um einen Symlink zu einem Verzeichnis.

Mit abschließendem Schrägstrich, wenn Sie sich mehr um die Dateien im Verzeichnis als um das Verzeichnis selbst sorgen.

Joe Inwap
quelle