El enlace simbólico a un directorio da resultados diferentes ls -l
dependiendo de si yo ln -s dir
o ln -s dir/
. Pero, ¿cuál es la diferencia real, y cuál debería preferir por qué?
El enlace simbólico a un directorio da resultados diferentes ls -l
dependiendo de si yo ln -s dir
o ln -s dir/
. Pero, ¿cuál es la diferencia real, y cuál debería preferir por qué?
Respuestas:
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 tar
TabSpacelink
completa a ln -s target/ link
.
foo -> bar/
entonces foo/qux
es 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í.
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.
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.
Su pregunta es realmente sobre el comportamiento del ls
programa.
1) Si lo haces ls -l $dir
donde $ dir es en realidad un enlace simbólico, obtienes información sobre el enlace simbólico.
2) Si lo hace ls -lL $dir
donde $ 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 ls
se 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í.