¿Debo incluir una barra inclinada final / en un enlace simbólico a un directorio?

30

El enlace simbólico a un directorio da resultados diferentes ls -ldependiendo de si yo ln -s diro ln -s dir/. Pero, ¿cuál es la diferencia real, y cuál debería preferir por qué?

Tobias Kienzler
fuente

Respuestas:

9

No hay diferencia (Habría una diferencia si el objetivo no fuera un directorio existente).

La barra final podría haber terminado allí debido a la finalización del shell: con alguna configuración, ln -s tarTabSpacelinkcompleta a ln -s target/ link.

Gilles 'SO- deja de ser malvado'
fuente
La pregunta vinculada parece ser sobre múltiples barras sucesivas en las rutas, pero no sobre barras finales en los enlaces. No estoy seguro de que tenga algo que decir aquí.
mwfearnley
En realidad, no debería haber dicho eso. Tiene bastante que decir sobre una preocupación común que está estrechamente relacionada con la pregunta. Sin embargo, no creo que lleve a esta conclusión.
mwfearnley
@mwfearnley Es una consecuencia lógica: si foo -> bar/entonces foo/quxes equivalente a bar//qux. Si bien el título de la pregunta, formalmente hablando, no incluye foo -> bar/, también discuto ese caso en mi respuesta allí.
Gilles 'SO- deja de ser malvado'
Hola, gracias por responder. Me dice que las rutas que incluyen enlaces simbólicos son equivalentes. No necesariamente me dice qué sucede si accedo al enlace simbólico en sí mismo (sin una barra inclinada final), y sin ser un experto en Unix, no necesariamente sé qué significa o no significa 'equivalencia'.
mwfearnley
Hay al menos un caso límite en el que hace la diferencia, así que tuve que rechazar esta respuesta.
Flimm
27

Lo único que se me ocurre es que te "protege" de que alguien elimine el directorio y cree un archivo.

[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 versión con la barra se rompe cuando el destino se reemplaza con un archivo.

locura del desarrollo
fuente
3

Pregunta interesante He hecho una pequeña prueba:

$ 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

Como puede ver, no hay diferencia en el número de llamadas al sistema (al menos para ls) y el seguimiento se ve muy similar. Sin embargo, esto es solo una prueba de volcado y no estoy seguro, puede haber algunas diferencias.

rvs
fuente
También me pregunto si realmente hace la diferencia, pero ¿por qué se almacena esa barra adicional entonces?
Tobias Kienzler
2

Su pregunta es realmente sobre el comportamiento del lsprograma.

1) Si lo haces ls -l $dirdonde $ dir es en realidad un enlace simbólico, obtienes información sobre el enlace simbólico.

2) Si lo hace ls -lL $dirdonde $ dir es un enlace simbólico a un directorio, obtendrá información sobre el directorio de destino.

3) Si lo hace ls -l $dir/., obliga a seguir el enlace simbólico y proporciona información sobre el directorio de destino.

4) Si lo hace ls -l $dir/, los resultados pueden ser los mismos que # 1 o pueden ser los mismos que # 3 dependiendo de la versión que lsse esté utilizando. Estaba acostumbrado a que una versión anterior de Solaris lo hiciera como # 1 y me sorprendió que Linux lo hiciera como # 3.

¿y cuál debería preferir por qué?

Sin la barra diagonal final si le preocupa si un nombre de directorio dado es un directorio real versus un enlace simbólico a un directorio.

Con la barra diagonal final si está más preocupado por los archivos en el directorio en lugar del directorio en sí.

Joe Inwap
fuente