Jetez un œil à realpath qui est disponible sur GNU/Linux, FreeBSD et NetBSD, mais pas sur OpenBSD 6.8. J'utilise quelque chose comme :
CONTAININGDIR=$(realpath ${FILEPATH%/*})
pour faire ce que vous semblez essayer de faire.
Pour obtenir le chemin complet, utilisez :
readlink -f relative/path/to/file
Pour obtenir le répertoire d'un fichier :
dirname relative/path/to/file
Vous pouvez également combiner les deux :
dirname $(readlink -f relative/path/to/file)
Si readlink -f n'est pas disponible sur votre système, vous pouvez utiliser ceci :
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Notez que si vous avez seulement besoin de vous déplacer vers un répertoire d'un fichier spécifié comme chemin relatif, vous n'avez pas besoin de connaître le chemin absolu, un chemin relatif est parfaitement légal, alors utilisez simplement :
cd $(dirname relative/path/to/file)
si vous souhaitez revenir (pendant l'exécution du script) au chemin d'origine, utilisez pushd au lieu de cd , et popd lorsque vous avez terminé.
* Alors que myreadlink ci-dessus est assez bon dans le contexte de cette question, il a une certaine limitation par rapport au readlink outil suggéré ci-dessus. Par exemple, il ne suit pas correctement un lien vers un fichier avec un basename différent .
Cela fonctionnera à la fois pour le fichier et le dossier :
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}