Antigua pregunta, pero hay una forma mucho más simple si se trata de nombres de ruta completos a nivel de shell:
abspath = "$ (cd" $ ruta "&& pwd)"
Como el cd ocurre en una subshell, no afecta el script principal.
Dos variaciones, suponiendo que sus comandos integrados de shell acepten -L y -P, son:
abspath = "$ (cd -P" $ ruta "&& pwd -P)" # ruta física con enlaces simbólicos resueltos
abspath = "$ (cd -L" $ ruta "&& pwd -L)" # ruta lógica conservando enlaces simbólicos
Personalmente, rara vez necesito este enfoque posterior a menos que me fascinen los enlaces simbólicos por alguna razón.
FYI: variación en la obtención del directorio de inicio de un script que funciona incluso si el script cambia su directorio actual más adelante.
name0 = "$ (nombre base" $ 0 ")"; #base name of script
dir0 = "$ (cd" $ (dirname "$ 0") "&& pwd)"; #absolute dir inicio
El uso de CD asegura que siempre tenga el directorio absoluto, incluso si el script se ejecuta mediante comandos como ./script.sh que, sin el cd / pwd, a menudo da solo ... Inútil si el script hace un cd más adelante.
/foo/bar
o incluso/foo
existe, o solo le interesa el aspecto de manipulación de cadenas de acuerdo con las reglas de nombre de ruta?