Старый вопрос, но есть гораздо более простой способ, если вы имеете дело с полными путями на уровне оболочки:
abspath = "$ (cd" $ path "&& pwd)"
Поскольку cd происходит в подоболочке, он не влияет на основной скрипт.
Два варианта, предполагающие, что встроенные команды вашей оболочки принимают -L и -P:
abspath = "$ (cd -P" $ path "&& pwd -P)" # физический путь с разрешенными символическими ссылками
abspath = "$ (cd -L" $ path "&& pwd -L)" # логический путь, сохраняющий символические ссылки
Лично мне этот поздний подход редко нужен, если я по какой-то причине не увлечен символическими ссылками.
К вашему сведению: вариант получения начальной директории скрипта, который работает, даже если скрипт позже меняет свою текущую директорию.
name0 = "$ (базовое имя" $ 0 ")"; # базовое имя скрипта
dir0 = "$ (cd" $ (dirname "$ 0") "&& pwd)"; #absolute начальный каталог
Использование компакт-диска гарантирует, что у вас всегда есть абсолютный каталог, даже если скрипт запускается такими командами, как ./script.sh, который, без cd / pwd, часто дает просто ... Бесполезно, если сценарий делает CD позже.
/foo/bar
или/foo
вообще существует, или вас интересует только аспект манипуляции со строками в соответствии с правилами имен путей?