Prova:
ABSOLUTE_PATH=$(cd /home/nohsib/dvc/../bop; pwd)
Quello che stai cercando è readlink
:
absolute_path=$(readlink -m /home/nohsib/dvc/../bop)
Nota: Devi usare readlink
di GNU implementazione che offre l'opzione "-m". readlink
di BSD per esempio no.
Se vuoi farlo senza seguire alcun collegamento simbolico, prova a utilizzare realpath
con l'opzione -s
:
$ realpath -s /home/nohsib/dvc/../bop
/home/nohsib/bop
Nota che con realpath
, normalmente devono esistere tutti tranne l'ultimo componente. Quindi, affinché quanto sopra funzioni, quanto segue deve essere presente nel file system:
/home
/home/nohsib
/home/nohsib/dvc
Ma puoi ignorare tale requisito utilizzando il -m
opzione.
$ realpath -sm /home/nohsib/dvc/../bop
/home/nohsib/bop
(Nota realpath
non è disponibile su tutti i sistemi, specialmente sui vecchi sistemi non Debian. Per coloro che lavorano su Linux embedded, sfortunatamente Busybox realpath
non supporta il -s
o -m
interruttori.)
Un problema con l'utilizzo di :
ABSOLUTE_PATH=$(cd ${possibleDirectory}; pwd)
è che se ${possibleDirectory} non esiste, ABSOLUTE_PATH verrà quindi impostato sulla directory corrente. Che probabilmente NON è quello che vuoi o ti aspetti.
Penso che l'utilizzo di questa versione possa essere più desiderabile in generale:
ABSOLUTE_PATH=$(cd ${possibleDirectory} && pwd)
Se ${possibleDirectory} non esiste o non è accessibile, a causa di permessi di accesso alla directory mancanti, ABSOLUTE_PATH conterrà la stringa vuota.
Il vantaggio di questo è che puoi quindi testare la stringa vuota o lasciarla fallire naturalmente, a seconda delle circostanze. L'impostazione predefinita della directory corrente nel caso di un comando 'cd' non riuscito può portare a risultati molto inaspettati e possibilmente disastrosi (ad es. rm -rf "$ABSOLUTE_PATH" )