Dois-je inclure une barre oblique / dans un lien symbolique vers un répertoire?

30

Symlinking à un répertoire donne des résultats différents avec ls -lselon que je ln -s dirou ln -s dir/. Mais quelle est la vraie différence, et laquelle dois-je préférer pourquoi?

Tobias Kienzler
la source

Réponses:

9

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 tarTabSpacelinkfinalise à ln -s target/ link.

Gilles 'SO- arrête d'être méchant'
la source
La question liée semble concerner plusieurs barres obliques successives dans les chemins, mais pas les barres obliques de fin sur les liens. Je ne suis pas sûr que cela ait quelque chose à dire ici.
mwfearnley
En fait, je n'aurais pas dû dire ça. Elle a beaucoup à dire sur une préoccupation commune étroitement liée à la question. Je ne pense pas que cela mène à cette conclusion.
mwfearnley
@mwfearnley C'est une conséquence logique: si foo -> bar/alors foo/quxest é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.
Gilles 'SO- arrête d'être méchant'
Salut, merci d'avoir répondu .. Il me dit que les chemins d'accès, y compris les liens symboliques, sont équivalents. Il ne me dit pas nécessairement ce qui se passe si j'accède au lien symbolique lui-même (sans barre oblique de fin), et sans être un expert Unix, je ne sais pas nécessairement ce que «l'équivalence» signifie ou ne signifie pas.
mwfearnley
Il y a au moins un cas de bord où cela fait une différence, j'ai donc dû voter contre cette réponse.
Flimm
27

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.

développementalinsanité
la source
3

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.

rvs
la source
Je me demande également si cela fait vraiment une différence, mais pourquoi cette barre oblique supplémentaire serait-elle stockée alors?
Tobias Kienzler
2

Votre question concerne vraiment le comportement du lsprogramme.

1) Si vous faites ls -l $diroù $ dir est en fait un lien symbolique, vous obtenez des informations sur le lien symbolique.

2) Si vous faites ls -lL $diroù $ 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 lsutilisé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.

Joe Inwap
la source