Zkuste:
ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)
To, co hledáte, je readlink
:
absolute_path=$(readlink -m /home/nohsib/dvc/../bop)
Poznámka: Musíte použít readlink
GNU implementace, která nabízí možnost "-m". BSD readlink
například ne.
Pokud to chcete udělat bez následování jakýchkoli symbolických odkazů, zkuste použít realpath
s možností -s
:
$ realpath -s /home/nohsib/dvc/../bop
/home/nohsib/bop
Všimněte si, že s realpath
, normálně musí existovat všechny komponenty kromě poslední. Aby výše uvedené fungovalo, musí být v systému souborů přítomno následující:
/home
/home/nohsib
/home/nohsib/dvc
Tento požadavek však můžete obejít pomocí -m
možnost.
$ realpath -sm /home/nohsib/dvc/../bop
/home/nohsib/bop
(Poznámka realpath
není k dispozici na všech systémech, zejména na starších systémech mimo Debian. Pro ty, kteří pracují na embedded Linuxu, bohužel Busybox realpath
nepodporuje -s
nebo -m
přepínače.)
Jeden problém s používáním :
ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)
je, že pokud ${possibleDirectory} neexistuje, bude ABSOLUTE_PATH nastavena na aktuální adresář. Což pravděpodobně NENÍ to, co chcete nebo očekáváte.
Myslím, že použití této verze může být obecně více žádoucí:
ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)
Pokud ${possibleDirectory} neexistuje nebo není přístupný z důvodu chybějících oprávnění k přístupu k adresáři, bude ABSOLUTE_PATH obsahovat prázdný řetězec.
Výhodou je, že pak můžete v závislosti na okolnostech otestovat prázdný řetězec nebo jej nechat přirozeně selhat. Výchozí nastavení aktuálního adresáře v případě selhání příkazu 'cd' může vést k velmi neočekávaným a možná katastrofálním výsledkům (např. rm -rf "$ABSOLUTE_PATH" )