Dai un'occhiata a realpath
disponibile su GNU/Linux, FreeBSD e NetBSD, ma non su OpenBSD 6.8. Uso qualcosa come:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
per fare quello che sembra tu stia cercando di fare.
Per ottenere il percorso completo utilizzare:
readlink -f relative/path/to/file
Per ottenere la directory di un file:
dirname relative/path/to/file
Puoi anche combinare i due:
dirname $(readlink -f relative/path/to/file)
Se readlink -f
non è disponibile sul tuo sistema puoi usare questo:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Nota che se hai solo bisogno di spostarti in una directory di un file specificato come percorso relativo, non hai bisogno di conoscere il percorso assoluto, un percorso relativo è perfettamente legale, quindi usa solo:
cd $(dirname relative/path/to/file)
se desideri tornare indietro (mentre lo script è in esecuzione) al percorso originale, usa pushd
invece di cd
e popd
quando hai finito.
* Mentre myreadlink
sopra è abbastanza buono nel contesto di questa domanda, ha qualche limitazione relativa al readlink
strumento suggerito sopra. Ad esempio, non segue correttamente un collegamento a un file con basename
diverso .
Funzionerà sia per file che per cartelle:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}