Die Verknüpfung mit einem Verzeichnis führt zu unterschiedlichen Ergebnissen, ls -l
je nachdem, ob ich ln -s dir
oder ln -s dir/
. Aber was ist der eigentliche Unterschied und welchen sollte ich bevorzugen, warum?
Die Verknüpfung mit einem Verzeichnis führt zu unterschiedlichen Ergebnissen, ls -l
je nachdem, ob ich ln -s dir
oder ln -s dir/
. Aber was ist der eigentliche Unterschied und welchen sollte ich bevorzugen, warum?
Antworten:
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 tar
TabSpacelink
to" abgeschlossen ln -s target/ link
.
foo -> bar/
dann foo/qux
gleichbedeutend mit bar//qux
. Während der Titel der Frage formell nicht beinhaltet foo -> bar/
, diskutiere ich diesen Fall auch in meiner Antwort dort.
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.
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.
Ihre Frage bezieht sich wirklich auf das Verhalten des ls
Programms.
1) Wenn Sie tun, ls -l $dir
wo $ dir tatsächlich ein Symlink ist, erhalten Sie Informationen über den Symlink.
2) Wenn Sie tun, ls -lL $dir
wo $ 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.