¿Por qué 'ls -L' imprime el nombre del enlace en sí, no el nombre del file al que apunta el enlace?

Al ejecutar una list "larga" de un enlace suave, ls -l muestra los attributes de file del enlace suave. Al ejecutar ls -lL (o ls -l --dereference ), los attributes del file son los del file al que apunta el enlace, pero aún así imprime el nombre del enlace en sí. La página man no dice nada sobre esto. La página de info en ls solo dice que " ls sigue imprimiendo el nombre del enlace en sí, no el nombre del file al que apunta el enlace", sin una explicación de por qué. Supongo que esta es una elección deliberada, pero ¿alguien sabe la razón de este comportamiento de ls -L ?

Debido a que el nombre de file en el otro extremo del enlace no es (o podría no ser) el nombre de file en el directory al que está accediendo con ls .

Dos problemas al mostrar el nombre del objective del enlace simbólico en lugar del nombre del enlace en sí:

  1. El file no existe. Si el nombre del objective del enlace simbólico se muestra en la list del directory, se le puede hacer creer que este es el nombre del file en ese directory, pero no lo es. El nombre del objective no es el nombre con el que accede al file en ese directory; el file con ese nombre de file no existe (en ese directory), o, en el peor de los casos, puede ser un file totalmente diferente (o un directory, o lo que sea) cuando se accede por ese nombre.

  2. Los files pueden parecer tener nombres idénticos. Si se muestra el nombre del objective del enlace simbólico, puede encontrar que es exactamente idéntico a otro nombre de file en ese directory, lo que no puede ser cierto en un sistema Unix.

En estos casos, genera confusión para los usuarios, y tendrían que verificar el listdo utilizando ls sin -L , lo que haría que la opción -L no tenga sentido.

Esto (que no muestra el nombre del objective) también es el comportamiento especificado por POSIX, bastante explícitamente:

Evalúe la información del file y el tipo de file para todos los enlaces simbólicos (ya sean nombrados en la línea de command o encontrados en una jerarquía de files) como los del file al que hace reference el enlace, y no el enlace en sí; sin embargo, ls escribirá el nombre del enlace en sí y no el file al que hace reference el enlace . Cuando -L se usa con -l , escriba el contenido de los enlaces simbólicos en el formatting largo (vea la sección STDOUT).

No hay más discusión al respecto en la sección de Fundamentos del manual de POSIX .

La lógica de los enlaces simbólicos para seguir mostrando el nombre del enlace y no el nombre del file vinculado cuando se usan las opciones -L o -H es la consistencia.

Una diferencia notable entre enlaces simbólicos y enlaces duros es que cuando se enumeran con ls -l , los permissions de un enlace simbólico son de poca utilidad (fuera de las iniciales s ) y el nombre de file muestra tanto el nombre del enlace como el nombre de ruta enlazado usando el convención symlink -> target . La razón de este comportamiento es que este ls -l funciona independientemente de si el objective existe o no. Su function es proporcionar información sobre el enlace simbólico en sí.

La opción -L se ha agregado para permitir un comportamiento similar a lo que sucede con un enlace fijo. Los permissions de file son los reales, es decir, los del inodo subyacente, y el nombre de file es el que se está consultando, no otra cosa. Eso sería confuso si ejecuta por ejemplo ls -lL a* y los nombres de file que no comienzan con a se mostrarán. Además, si el enlace de destino no existe, no hay permissions para mostrar porque no hay un inodo subyacente, y el ls -lL falla por error.

Otra buena razón para explicar por qué se hace de esa manera es que un enlace simbólico a menudo se asocia con una ruta relativa o absoluta, no con un nombre de file único, pero no hay ninguna disposition para mostrar una ruta relativa o completa con ls -l , solo nombres de file simples sin barras o punto punto …