readlink
- стандарт bash для получения абсолютного пути. Он также имеет преимущество, заключающееся в том, что он возвращает пустые строки, если пути или путь не существует (учитывая флаги для этого).
Чтобы получить абсолютный путь к каталогу, который может существовать или не существовать, но чьи родители существуют, используйте:
abspath=$(readlink -f $path)
Чтобы получить абсолютный путь к каталогу, который должен существовать вместе со всеми родителями:
abspath=$(readlink -e $path)
Чтобы канонизировать данный путь и следовать символическим ссылкам, если они существуют, но в противном случае игнорировать пропущенные каталоги и просто возвращать путь, это:
abspath=$(readlink -m $path)
Единственным недостатком является то, что readlink будет следовать ссылкам. Если вы не хотите переходить по ссылкам, вы можете использовать это альтернативное соглашение:
abspath=$(cd ${path%/*} && echo $PWD/${path##*/})
Это приведет к chdir к части каталога $ path и распечатает текущий каталог вместе с файловой частью $ path. Если не удается выполнить chdir, вы получите пустую строку и ошибку в stderr.