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
}