Linux / Comando / readlink: consultar el destino de un enlace simbólico
readlink es un comando que imprime la ruta de destino almacenada en un archivo de enlace simbólico. Es útil para verificar si el enlace contiene una ruta relativa o hacia qué ubicación apunta un enlace roto.
GNU readlink también admite la normalización de rutas con -f, -e y -m, pero GNU Coreutils recomienda usar realpath para la normalización de rutas común, ya que tiene un nombre más claro y funciones más precisas.
¿Qué es el comando readlink?
Cuando se especifica un enlace simbólico como argumento, imprime la cadena de destino almacenada en el enlace.
readlink current
Si el enlace current apunta a releases/2026-09, se imprimirá de la siguiente manera.
releases/2026-09
Este valor puede ser una ruta relativa que se interpreta en relación con la ubicación del enlace. El readlink básico muestra la cadena almacenada sin convertirla a una ruta absoluta.
Sintaxis y uso básico
readlink [OPCIONES] ARCHIVO ...
Practique en una carpeta nueva de su propiedad, sin un elemento previo llamado current. El siguiente ln -s guarda el destino releases/2026-09 aunque este todavía no exista: readlink sin opciones puede mostrar esa cadena. Para probar -e, prepare primero el destino real.
ln -s releases/2026-09 current
readlink current
Si se especifica un archivo o directorio normal sin opciones, no hay un valor de destino del enlace, por lo que no se imprime y falla con un estado de salida distinto de 0.
readlink /etc/passwd
printf '%s\n' "$?"
Comprender los enlaces relativos y absolutos
Enlaces que guardan rutas relativas
El objetivo de un enlace relativo se interpreta según el directorio donde se encuentra el enlace, no según la ubicación actual del terminal.
ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml
Este ejemplo presupone que /srv/app existe y que puede crear el enlace allí; no lo aplique sobre una configuración operativa. La cadena ../shared/config.yml, interpretada desde /srv/app, designa /srv/shared/config.yml. Puede practicar la misma estructura bajo una carpeta propia.
Enlaces que guardan rutas absolutas
ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current
Un enlace absoluto genera una cadena de destino que comienza desde la raíz, como se muestra a continuación.
/srv/releases/2026-09
Los enlaces absolutos tienen una ubicación clara, pero es fácil que se rompan si se mueve el árbol de archivos a otra ruta. Debe elegir entre enlaces relativos y absolutos considerando la estructura de distribución y la posibilidad de moverlos.
Comprobar enlaces simbólicos no resolubles
Incluso si no existe el archivo de destino, si el enlace simbólico en sí permanece, readlink puede leer la cadena de destino almacenada.
ln -s missing-target broken-link
readlink broken-link
missing-target
La existencia del destino del enlace puede verificarse por separado de la siguiente manera.
if [ -L broken-link ] && [ ! -e broken-link ]; then
printf '%s\n' 'El destino del enlace no está disponible.'
fi
-L verifica la existencia del enlace en sí, mientras que -e verifica la existencia del destino siguiendo el enlace. Los problemas de permisos o las circulaciones de enlaces también pueden afectar los resultados.
Opciones de normalización de rutas
GNU readlink proporciona un modo para normalizar rutas además de mostrar la cadena del destino del enlace.
| Opciones | Funcionamiento |
|---|---|
-f, --canonicalize |
El camino debe existir excepto por el último componente, y se interpretan los enlaces simbólicos y los componentes de punto. |
-e, --canonicalize-existing |
Todos los componentes, incluido el último, deben existir. |
-m, --canonicalize-missing |
También se asume que los componentes que no existen son directorios a fin de normalizar la ruta. |
Imprimir la ruta normalizada con -f
readlink -f /srv/current/config.yml
Se imprimirá la ruta absoluta con el manejo de enlaces simbólicos y ., ... El último elemento puede estar ausente, pero los componentes anteriores deben existir.
Requerir la existencia de todos los componentes con -e
readlink -e /srv/current/config.yml
La ruta completa, incluyendo el archivo de destino, debe existir para que se produzca el resultado. No evita la condición de carrera en la que el destino puede cambiar entre la verificación de existencia y el uso real.
Normalizar incluso rutas inexistentes con -m
readlink -m /srv/future/../uploads/new-file.txt
También se procesan los componentes intermedios que no existen, por lo que se puede usar para planificación de rutas o limpieza de cadenas. No hay garantía de que la ubicación impresa pueda ser creada realmente.
Manejo de múltiples enlaces y separación de salida
Verificar múltiples enlaces simbólicos
GNU readlink puede recibir varios enlaces a la vez.
readlink current previous config-link
Cada destino se imprime en una línea. Los nombres del ejemplo current, previous y config-link deben corresponder a enlaces de prueba. El bucle omite los errores mediante continue; no demuestra que todos hayan sido leídos. Además, $(...) elimina los saltos de línea finales. Para conservar destinos arbitrarios, utilice una salida delimitada por NUL sin capturarla así.
for link in current previous config-link; do
target=$(readlink -- "$link") || continue
printf '%s -> %s\n' "$link" "$target"
done
Diferencia entre -n y -z
-n o --no-newline omiten el carácter separador al final de la salida al procesar un solo enlace. Puede aparecer una advertencia si se usa con varios archivos.
readlink -n current
-z o --zero imprimen un carácter NUL al final de cada resultado en lugar de un salto de línea. En la automatización donde los nombres de archivo o los destinos de los enlaces pueden contener saltos de línea, -z es más claro.
readlink -z current previous
Comparación entre readlink, realpath, ls y stat
| Comando | Objetivo principal | Características |
|---|---|---|
readlink |
Verificar la cadena de destino almacenada en el enlace | Incluso los enlaces rotos pueden ser leídos por sí mismos |
realpath |
Normalización de nombres de archivo y cálculo de rutas relativas | GNU Coreutils recomienda realpath para la canonicalización general de rutas. |
ls -l |
Verifique enlaces y objetivos de manera legible para humanos desde la lista | Mostrado junto con otra información de la lista, no apto para análisis |
stat |
Verificación de metadatos detallados de enlaces o objetivos | Se pueden comprobar inodo, permisos, tiempo y tipo de archivo |
Si en la automatización solo se necesita la cadena de destino del enlace, readlink es adecuado. Si el propósito es la normalización general de rutas y la conversión a rutas relativas, realpath es más claro.
Uso en scripts de shell
Verificar si el objetivo del enlace es una ruta relativa
target=$(readlink -- "$link") || {
printf '%s\n' 'No se puede leer el enlace simbólico.' >&2
exit 1
}
case "$target" in
/*) printf '%s\n' 'El enlace guarda una ruta absoluta.' ;;
*) printf '%s\n' 'El enlace guarda una ruta relativa.' ;;
esac
Antes del bloque anterior, asigne link='current' en la misma sesión de Bash, o sustitúyalo por un enlace existente que pueda leer. El bloque clasifica la cadena almacenada: una ruta relativa se interpreta desde el directorio que contiene el enlace, no desde el directorio de trabajo del proceso.
Verificar el estado de salida
En lugar de solo verificar si la salida está vacía, compruebe si el comando se ejecutó correctamente. El destino del enlace no puede ser una cadena vacía, pero puede expresar la intención de manejo de errores de manera más clara.
if target=$(readlink -- "$link"); then
printf '%s\n' "$target"
else
printf 'No se pudo leer el enlace: %s\n' "$link" >&2
fi
Resumen de opciones principales
| Opciones | Descripción |
|---|---|
-f, --canonicalize |
Resuelve la ruta y permite que falte únicamente el último componente. |
-e, --canonicalize-existing |
Todos los componentes de la ruta deben existir para que tenga éxito. |
-m, --canonicalize-missing |
También trata los componentes que no existen como directorios. |
-n, --no-newline |
Omite el carácter de separación de salida después de un solo resultado. |
-z, --zero |
Termina cada resultado con un carácter NUL. |
-q, -s, --quiet |
Suprime la mayoría de los mensajes de error. |
-v, --verbose |
Muestra mensajes de error. |
Problemas comunes
Falla sin ninguna salida
En el modo predeterminado, la ruta especificada puede no ser un enlace simbólico o puede que no se pueda acceder al enlace en sí. Verifique el estado de salida y, si es necesario, muestre el mensaje de error con -v.
El destino relativo del enlace parece incorrecto
La ruta relativa mostrada debe interpretarse en función del directorio donde se encuentra el enlace. No se basa en el directorio desde el que se ejecutó el comando.
readlink -f no funciona en otros sistemas
Las opciones de normalización, incluido -f, tienen diferencias de implementación. En scripts que requieren portabilidad, verifique si el sistema operativo de destino las admite y, si el objetivo es la normalización de rutas, compare también las implementaciones y opciones disponibles de realpath.
FAQ
¿readlink lee el contenido del archivo al que apunta un enlace simbólico?
No. En el modo predeterminado, imprime la cadena de ruta de destino almacenada en el archivo de enlace. No lee el contenido del archivo de destino.
¿Se puede verificar un enlace simbólico roto con readlink?
Si el enlace existe y se puede leer, readlink sin opciones muestra la cadena de destino guardada en él. La normalización con -e solo tiene éxito si también existe el destino real.
Si se imprime la ruta relativa, ¿cómo puedo verificar la ruta absoluta?
En un entorno GNU puede utilizar readlink -f ENLACE, pero para normalizar rutas en general, realpath expresa mejor la operación y ofrece opciones más específicas.
¿Por qué usar readlink en lugar de ls -l?
ls -l es adecuado para consultar una lista legible por personas; readlink muestra solo la cadena de destino y resulta útil en scripts. En la automatización, gestione también el estado de salida y los delimitadores de los nombres de archivo.
Para ampliar la consulta de metadatos y comparar herramientas, consulte Linux / Comando / stat - Ver información y metadatos del archivo y Lista de comandos de uso frecuente en Linux.
Para las condiciones exactas de canonicalización, consulte Documentación oficial de GNU Coreutils readlink y Documentación oficial de GNU Coreutils realpath.




