¿Cuál es la diferencia entre "realpath" y "readlink -f"

68

He leído mucho sobre el realpathcomando y cómo se ha desaprobado con el readlink -fser ahora recomendado. También he visto en algunos lugares que la razón por la que se introdujo Realpath fue la falta de dicha funcionalidad en el enlace de lectura y que una vez que se introdujo, Realpath ya no era necesario y la mayoría de los vendedores de sistemas operativos suspendieron su soporte.

La razón de mi pregunta es que también he visto a muchas personas recomendar readlink -fcomo un comando "bastante similar" realpath, y eso es lo que me molesta, porque nadie explica esa parte "bastante similar". ¿Cuáles son las diferencias reales?

Felipe Leão
fuente

Respuestas:

73

Hay varios realpathcomandos alrededor.

La realpathutilidad es un envoltorio alrededor de las realpathfunciones de la biblioteca y se ha reinventado muchas veces .

Debian solía mantener un realpathpaquete ( separado de dwwwdesde woody ) que no ha cambiado, excepto en relación con el embalaje y la documentación desde 2001, pero ahora se ha eliminado. Esta utilidad quedó en desuso porque ahora hay más alternativas estándar (GNU readlinky pronto GNU realpath), pero en ese momento, las utilidades de GNU ni siquiera tenían readlink. Esta implementación de algunos realpathadmite algunos optionspara evitar la resolución de enlace simbólico o producir una salida con terminación nula. BusyBox también incluye su propio realpathcomando (que no tiene opción).

GNU coreutils introdujo un realpathcomando en la versión 8.15 en enero de 2012. Este es un reemplazo compatible para BusyBox y Debian realpath, y también tiene muchas opciones en común con GNU readlink.

realpathtiene el mismo efecto que readlink -fcon GNU readlink. Lo que distingue los dos comandos (o más bien los diversos realpathcomandos readlink -f) son las opciones adicionales que admiten.

GNU realpathno está en desuso; tiene el problema opuesto: es demasiado nuevo para estar disponible en todas partes. Debian solía omitir GNUrealpath de su coreutilspaquete y quedarse con el suyo realpath. No sé por qué, ya que GNU realpathdebería ser un reemplazo directo. A partir de Debian jessie y Ubuntu 16.04, sin embargo, realpathse utiliza GNU .

En los sistemas Linux, en este momento, su mejor opción para canonizar una ruta que puede contener enlaces simbólicos es readlink -f.

Los sistemas BSD tienen un readlinkcomando, con diferentes capacidades de GNU readlink. En particular, BSD readlinkno tiene una opción para canonizar las rutas, solo atraviesa el enlace simbólico que se le pasó.

readlinkPor cierto, tenía el mismo problema: también se inventó muchas veces (no agregar esta utilidad cuando se agregaron enlaces simbólicos a Unix fue una omisión lamentable). Ahora se ha estabilizado en varias implementaciones con muchos indicadores incompatibles (en particular BSD vs. GNU).

Gilles 'SO- deja de ser malvado'
fuente
8
readlink -festaba en OpenBSD mucho antes de GNU. Todos NetBSD, FreeBSD y OpenBSD ahora tienen readlink -f(su enlace incluso lo menciona). realpathha estado en FreeBSD e IRIX durante mucho tiempo (no sé si es anterior al de Debian). HPUX e IRIX también tienen readlink, aunque no -f. El realpathpaquete en Debian experimental ahora es el de coreutils (como un experimento para ver si rompe cosas). El dwww realpathactúa más como readlink -eel GNU, readlink -fpor lo que no es un reemplazo completo de Dropin
Stéphane Chazelas
2
realpathha estado en FreeBSD desde 2002. Antes de eso, pwdlo estaba haciendo (desde el año 2000, pwd some-filese llame realpath()en file). Debian ha tenido un realpathpaquete desde 1996. El de IRIX, probablemente anterior a él sin embargo no he encontrado ninguna evidencia aparte de que era en IRIX 6.5 en 1998. OpenBSD añadió una -fa readlink en 1997 . GNU agregó readlinken 2003 y lo tuvo -fdesde el principio.
Stéphane Chazelas
2
Excelente resumen gracias. Tenga en cuenta que un error mejor para la solicitud de Debian para cambiar a la variante GNU es bugs.debian.org/730779 Incluso el mantenedor realpath existente quiere que el cambio suceda
Pádraig Brady
1
Impresionante respuesta. Solo faltaron referencias a la implementación de RHEL de realpath. ¿Alguien sabe si es de alguna manera diferente de la readlink -fversión?
Felipe Leão
1
@ StéphaneChazelas Oh, vaya, muchos errores en mis respuestas. Gracias por señalarlos. ¿Podría publicar una respuesta correcta y eliminaré la mía? (De lo contrario, corregiré los errores, pero es más trabajo agregar a mi larga lista de tareas pendientes ...)
Gilles 'SO- deja de ser malvado'
17

tl; dr readlink -f regresará 0para un archivo inexistente en un directorio existente mientras que realpathretorna 1. Sin embargo, readlink -ese comportará como realpathy regresará 1para un archivo inexistente (vea la nota del editor al final).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f con directorio inexistente

readlink -f El comportamiento varía dependiendo de qué parte de la ruta no existe.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

Disponibilidad

readlinkestá instalado en la mayoría de las distribuciones de Linux. Mientras que, a realpathmenudo se debe instalar explícitamente.

En resumen

Si desea reemplazar llamadas para realpath ...luego usar readlink -e ....


Probado con readlink (GNU coreutils) 8.21 y realpath versión 1.19 en Ubuntu 16.

( Ed .: @AnthonyGeoghegan escribió " esto se refiere a la versión Debian de realpath. La versión GNU de se realpathcomporta igual quereadlink -f ")

JamesThomasMoon1979
fuente
3
Voté esta respuesta pero sugeriría aclarar que se refiere a la versión de Debian realpath. La versión GNU de se realpathcomporta igual que readlink -f.
Anthony G - justicia para Mónica
2
Puede confirmar que esto no funciona en MacOS High Sierra.
Pred