Pergunta antiga, mas há uma maneira muito mais simples se você estiver lidando com nomes de caminhos completos no nível do shell:
abspath = "$ (cd" $ path "&& pwd)"
Como o CD acontece em um subshell, não afeta o script principal.
Duas variações, supondo que os comandos internos do shell aceitem -L e -P, são:
abspath = "$ (cd -P" $ path "&& pwd -P)" # caminho físico com links simbólicos resolvidos
abspath = "$ (cd -L" $ path "&& pwd -L)" # caminho lógico preservando links simbólicos
Pessoalmente, raramente preciso dessa abordagem posterior, a menos que esteja fascinado com links simbólicos por algum motivo.
FYI: variação na obtenção do diretório inicial de um script que funciona mesmo que o script altere seu diretório atual posteriormente.
name0 = "$ (nome da base" $ 0 ")"; #base nome do script
dir0 = "$ (cd" $ (nome do diretório "$ 0") "&& pwd)"; #absolute começando dir
O uso do CD garante que você sempre tenha o diretório absoluto, mesmo que o script seja executado por comandos como ./script.sh que, sem o cd / pwd, geralmente fornecem apenas .. Inútil se o script gravar um CD posteriormente.
/foo/bar
ou/foo
realmente existe, ou você está interessado apenas no aspecto de manipulação de cadeias de acordo com as regras de nome de caminho?