Estoy escribiendo un script que necesita una ruta canónica para ciertos comandos. Dado que podría haber enlaces simbólicos que apunten a los comandos reales, utilizo readlink -f
para obtener la ruta canónica. Pero no obtengo lo que realmente quiero readlink -f
, lo explicaré con el siguiente ejemplo:
Digamos que mi directorio actual es: /home/user/Documents
Si intento obtener una ruta sleep
con, readlink -f
obtengo esto:
/home/user/Documents/sleep
Lo que realmente quiero es/bin/sleep
Respuesta1
readlink -f "$(type -P sleep)"
o si eres consciente del rendimiento:
cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")"
Usar readlink -e
(existente) en lugar de readlink -f
puede salvarlo de este tipo de accidente en el que opera con un archivo inexistente.
El segundo ejemplo supone que la ruta devuelta por type -P
es canónica, lo que significa que asume que su ruta no tiene componentes no canónicos.