Linux / Comando / realpath: normalizar rutas absolutas y relativas
realpath es un comando que procesa rutas relativas, . y .., manejando barras duplicadas y enlaces simbólicos para imprimir la ruta normalizada. Es útil para verificar la ubicación real de un archivo, comparar cómo se interpretan dos rutas o crear rutas relativas a un directorio base.
Si los componentes de la ruta deben existir o no depende de -e, -E y -m. Además, solo con el resultado del cálculo de la ruta no se puede considerar que un archivo se abrió de manera segura, por lo que se requiere precaución adicional para la verificación de seguridad.
¿Qué es el comando realpath?
realpath normaliza y muestra el nombre de archivo o la ruta de directorio. El resultado habitual es una ruta absoluta y se procesan los componentes innecesarios /, ., .. y los enlaces simbólicos.
realpath ./docs/../images/logo.webp
La salida siguiente presupone un directorio de trabajo /home/user/project, con los directorios docs e images existentes y sin enlaces que cambien la resolución mostrada. En el modo GNU predeterminado, el archivo final puede no existir; si necesita comprobarlo, use -e.
/home/user/project/images/logo.webp
El resultado exacto depende del directorio de trabajo actual, la estructura real de los directorios y la configuración de enlaces simbólicos.
Sintaxis y uso básico
realpath [OPCIONES] ARCHIVO ...
Si se especifican múltiples rutas, se imprimirá el resultado procesado de cada una en una línea separada.
realpath .
realpath ../logs/app.log
realpath /var//log/./nginx/../syslog
Si solo necesita la ruta física del directorio actual, pwd -P es más directo. realpath puede manejar no solo la ubicación actual, sino también varias rutas especificadas.
Seleccionar condición de existencia de la ruta
La tabla describe las opciones de GNU realpath actual. Compruebe realpath --version y realpath --help: algunas versiones anteriores, como GNU Coreutils 8.32, no admiten -E. El modo GNU predeterminado permite que falte el último componente; no presuponga el mismo comportamiento u opciones en todas las implementaciones.
| Opciones | Condición de existencia |
|---|---|
-E, --canonicalize |
Permitir que falte el último componente. Este es el comportamiento predeterminado de GNU, pero se puede especificar para portabilidad. |
-e, --canonicalize-existing |
Todos los componentes de la ruta, incluido el último elemento, deben existir realmente. |
-m, --canonicalize-missing |
Asumir que los componentes intermedios son directorios y normalizar la cadena incluso si faltan. |
Permitir solo rutas existentes con -e
realpath -e /etc/passwd
realpath --canonicalize-existing /srv/app/config.yml
Si falta incluso un solo componente o no se puede acceder a él, falla. Es útil cuando se desea pasar a la siguiente operación solo los objetivos que realmente existen, pero no evita situaciones en las que el objetivo cambia inmediatamente después de la verificación.
Permitir que falte el último componente con -E
realpath -E /srv/uploads/new-file.txt
Se puede usar en situaciones donde se puede verificar la ruta superior pero todavía no se ha creado el archivo final. En GNU es el comportamiento predeterminado, pero para reducir las diferencias en un entorno POSIX, es recomendable indicar la intención como opción.
Calcular rutas con componentes intermedios inexistentes mediante -m
realpath -m /srv/not-created/../future/file.txt
-m trata los componentes que no existen en el sistema de archivos como si fueran directorios. Es útil al calcular las cadenas de ruta de antemano, pero no garantiza que la ruta de salida exista realmente o sea posible de crear.
Enlaces simbólicos y -L, -P, -s
Las rutas que contienen .. y enlaces simbólicos pueden ubicarse en diferentes posiciones según el orden de procesamiento.
| Opciones | Funcionamiento |
|---|---|
-P, --physical |
Cuando se encuentra un enlace simbólico, se interpreta antes de procesar los .. posteriores. Este es el modo predeterminado de GNU. |
-L, --logical |
Después de procesar lógicamente la cadena de ruta .., se interpreta el enlace simbólico. |
-s, --strip, --no-symlinks |
Sin seguir el enlace simbólico, solo se limpian los componentes de puntos y las barras diagonales duplicadas. |
Verificar ruta física
realpath -P /srv/current/../shared
Si /srv/current es un enlace que apunta a otra ubicación, primero se interpreta ese destino y luego se calcula el directorio padre.
Preservar enlaces simbólicos y limpiar solo la cadena
realpath -s -m /srv/current/../shared
Al usar -s y -m juntos, se puede limpiar la cadena de ruta sin seguir los enlaces del sistema de archivos real. No se debe usar esta combinación cuando se necesite la ubicación real del destino.
Mostrar ruta relativa
Especificar directorio de referencia con --relative-to
Puede imprimir la ruta procesada como una ruta relativa a un directorio específico.
realpath --relative-to=/srv/www /srv/www/assets/css/site.css
Este resultado presupone que existen los directorios padre de la ruta y que no hay enlaces que desvíen su resolución. Las rutas de /srv son ilustrativas; para calcular una ruta puramente prevista que todavía no existe, añada -m. Con la estructura indicada, la salida relativa es:
assets/css/site.css
--relative-base para relativizar solo la subruta
Solo se imprime como ruta relativa si el destino está debajo del directorio base, y si está fuera, se mantiene la ruta absoluta.
realpath --relative-base=/srv/www /srv/www/index.html /var/log/syslog
La primera ruta se convierte en relativa y la segunda se imprime como ruta absoluta porque está fuera del directorio base.
Diferencias entre readlink -f y realpath
| Elementos de comparación | realpath |
readlink -f |
|---|---|---|
| Objetivo principal | Normalización de nombres de archivo y conversión de rutas relativas | Con -f, canonicaliza rutas y también acepta archivos que no son enlaces. |
| Salida relativa | Soporte para --relative-to y --relative-base |
Normalmente salida de ruta absoluta y normalizada |
| Uso recomendado | Para la normalización de rutas, la documentación de GNU recomienda realpath |
Sin opciones lee la cadena del enlace; -f activa un modo de canonicalización distinto. |
| Portabilidad | Se deben verificar las diferencias de implementación entre las opciones y las condiciones de existencia predeterminadas | -f no se puede asumir que sea el mismo en todas las implementaciones de Unix |
Uso en scripts de shell
Registrar la ruta real del archivo de configuración
config=$(realpath -e -- "$1") || {
printf '%s\n' 'No se pudo resolver la ruta de configuración.' >&2
exit 1
}
printf 'Archivo de configuración: %s\n' "$config"
Guarde el bloque anterior en resolve-config.sh y ejecútelo, por ejemplo, con bash resolve-config.sh ./config.ini. -e exige que la ruta exista; no demuestra que sea un archivo normal ni que tenga permiso para leerlo. Un destino existente produce la ruta; uno ausente termina con estado 1. La ruta puede cambiar después de la comprobación.
Separar de manera segura varios nombres de archivo
-z o --zero imprimen un carácter NUL al final de cada resultado en lugar de un salto de línea.
realpath -z -- file1 "file with space"
El formato NUL permite separar nombres que contienen saltos de línea, siempre que el programa receptor lo admita. -z cambia el delimitador, no las condiciones de existencia: utilice -e junto con él si todos los destinos deben existir. Cuando capture una salida normal mediante $(...), recuerde que Bash elimina los saltos de línea finales.
Precauciones al usar para la validación de rutas
Normalización y permisos de acceso son cosas diferentes
El hecho de que una ruta normalizada aparezca bajo un directorio específico no significa que se otorguen automáticamente permisos de lectura o escritura. Se deben verificar por separado la propiedad, los permisos, las listas de control de acceso (ACL) y la política de seguridad.
El destino puede cambiar entre la verificación y el uso.
Si un enlace simbólico o un directorio cambia entre la verificación con realpath y la apertura del archivo, puede terminar usando un destino diferente. En límites de seguridad, no confíe únicamente en la comparación de cadenas simples y utilice los métodos seguros de apertura de archivos y separación de permisos que proporciona el sistema operativo.
Tenga cuidado con la comparación de cadenas con prefijo.
/srv/www-safe también comienza como cadena con /srv/www. Al verificar si se incluye la ruta base, debe considerar los límites del directorio, y la normalización de rutas por sí sola no crea un sandbox seguro.
Resumen de opciones principales
| Opciones | Descripción |
|---|---|
-E, --canonicalize |
Normalice la ruta incluso si falta el último componente. |
-e, --canonicalize-existing |
Todos los componentes deben existir para que sea exitoso. |
-m, --canonicalize-missing |
Los componentes que no existen también se tratan como directorios. |
-L, --logical |
Después de procesar lógicamente .., se interpretan los enlaces simbólicos. |
-P, --physical |
Es el modo físico que interpreta primero los enlaces simbólicos y es el valor predeterminado de GNU. |
-s, --no-symlinks |
Limpia la cadena de ruta sin interpretar los enlaces simbólicos. |
--relative-to=DIRECTORIO |
Imprime rutas relativas basadas en el directorio especificado. |
--relative-base=DIRECTORIO |
Solo imprime rutas relativas bajo la base especificada. |
-q, --quiet |
Suprime mensajes de diagnóstico sobre la ruta especificada. |
-z, --zero |
Separa los resultados con caracteres NUL. |
FAQ
¿Se puede usar realpath incluso en archivos que no existen?
El comportamiento básico de GNU o -E puede manejar incluso si falta el último componente. Si también puede faltar un componente intermedio, use -m, y si se requiere la existencia de todos los componentes, use -e.
¿realpath siempre resuelve enlaces simbólicos?
En el modo físico predeterminado, resuelve enlaces simbólicos. Si desea limpiar solo la cadena de ruta sin seguir enlaces, use -s o --no-symlinks.
¿Cuál es la diferencia entre pwd -P y realpath .?
Ambos pueden mostrar la ruta física absoluta de la ubicación actual. pwd -P está especializado para el directorio de trabajo actual, y realpath ofrece varias rutas especificadas, condiciones de existencia y opciones de salida de rutas relativas.
¿Solo verificar el resultado de realpath puede prevenir ataques de exploración de rutas?
No. La ruta puede cambiar entre la verificación y el uso del archivo, y los problemas de permisos son diferentes. En límites de confianza, se deben usar conjuntamente API de apertura segura de archivos, separación de permisos y verificaciones de límites de directorios.
Para ampliar la consulta de metadatos y comparar comandos, consulte Linux / Comando / stat - Ver información y metadatos del archivo y Lista de comandos de uso frecuente en Linux.
Las condiciones de resolución y los ejemplos completos se describen en Documentación oficial de GNU Coreutils realpath y Ejemplos de uso de GNU Coreutils realpath.




