Symlinking à un répertoire donne des résultats différents avec ls -l
selon que je ln -s dir
ou ln -s dir/
. Mais quelle est la vraie différence, et laquelle dois-je préférer pourquoi?
Symlinking à un répertoire donne des résultats différents avec ls -l
selon que je ln -s dir
ou ln -s dir/
. Mais quelle est la vraie différence, et laquelle dois-je préférer pourquoi?
Réponses:
Il n'y a aucune différence. (Il y aurait une différence si la cible n'était pas un répertoire existant.)
La barre oblique finale aurait pu se terminer là - bas en raison de l' achèvement shell: avec une certaine configuration, ln -s tar
TabSpacelink
finalise à ln -s target/ link
.
foo -> bar/
alors foo/qux
est équivalent à bar//qux
. Bien que le titre de la question, formellement parlant, n'inclue pas foo -> bar/
, j'examine également ce cas dans ma réponse.
La seule chose à laquelle je peux penser est que cela vous "protège" de la suppression du répertoire et de la création d'un fichier.
[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]$
La version avec la barre oblique se casse lorsque la cible est remplacée par un fichier.
Question intéressante. J'ai fait un petit test:
$ 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
Comme vous pouvez le voir, il n'y a pas de différence dans le nombre d'appels système (au moins pour ls) et les traces semblent très similaires. Cependant, ce n'est qu'un test de vidage et je ne suis pas sûr - il pourrait y avoir des différences.
Votre question concerne vraiment le comportement du ls
programme.
1) Si vous faites ls -l $dir
où $ dir est en fait un lien symbolique, vous obtenez des informations sur le lien symbolique.
2) Si vous faites ls -lL $dir
où $ dir est un lien symbolique vers un répertoire, vous obtenez des informations sur le répertoire cible.
3) Si vous le faites ls -l $dir/.
, le lien symbolique doit être suivi et fournit des informations sur le répertoire cible.
4) Si vous le faites ls -l $dir/
, les résultats peuvent être les mêmes que # 1 ou peuvent être les mêmes que # 3 selon la version de ls
utilisée. J'étais habitué à une ancienne version de Solaris qui le faisait comme # 1 et j'ai été surpris par Linux qui le faisait comme # 3.
et lequel devrais-je préférer pourquoi?
Sans barre oblique si vous vous demandez si un nom de répertoire donné est un répertoire réel par rapport à un lien symbolique vers un répertoire.
Avec une barre oblique si vous êtes plus concerné par les fichiers du répertoire plutôt que par le répertoire lui-même.