Ancienne question, mais il existe un moyen beaucoup plus simple si vous traitez des noms de chemin complets au niveau du shell:
abspath = "$ (cd" $ path "&& pwd)"
Comme le cd se produit dans un sous-shell, il n'a pas d'impact sur le script principal.
Deux variantes, en supposant que vos commandes intégrées au shell acceptent -L et -P, sont:
abspath = "$ (cd -P" $ path "&& pwd -P)" # chemin physique avec liens symboliques résolus
abspath = "$ (cd -L" $ path "&& pwd -L)" # chemin logique préservant les liens symboliques
Personnellement, j'ai rarement besoin de cette approche ultérieure, sauf si je suis fasciné par les liens symboliques pour une raison quelconque.
FYI: variation sur l'obtention du répertoire de départ d'un script qui fonctionne même si le script change son répertoire actuel plus tard.
name0 = "$ (nom de base" $ 0 ")"; #base nom du script
dir0 = "$ (cd" $ (dirname "$ 0") "&& pwd)"; #absolute dir de départ
L'utilisation de CD garantit que vous avez toujours le répertoire absolu, même si le script est exécuté par des commandes telles que ./script.sh qui, sans cd / pwd, donne souvent juste .. Inutile si le script fait un cd plus tard.
/foo/bar
ou même d'/foo
exister réellement, ou êtes-vous uniquement intéressé par l'aspect de manipulation de chaîne selon les règles de nom de chemin?