Un script Bash peut-il fournir le chemin vers le répertoire dans lequel il est stocké ?

Un script Bash peut être exécuté à partir de n'importe quel dossier d'un système d'exploitation et être stocké dans un autre dossier. En utilisant certaines commandes, il est possible pour un script Bash d'indiquer quelle est sa localisation.

La première méthode utilise une seule ligne de code et les caractères spéciaux $(). Ces symboles indiquent que la commande entre parenthèses doit être exécutée dans un autre terminal et que le résultat doit être retourné. La variable ${BASH_SOURCE[0]} contient le nom complet du script avec le chemin. La première partie de la commande va consister à utiliser dans un autre terminal la commande dirname sur cette variable pour obtenir le dossier courant du script. On va ensuite exécuter la commande cd afin de se rendre dans le répertoire en résolvant les liens symboliques puis la commande pwd qui affiche le chemin absolu du répertoire dans lequel se trouve le shell. Toutes ces commandes sont lancées dans un autre terminal et le résultat de la commande pwd est stocké dans une variable grâce aux caractères $().
REPERTOIRE_SCRIPT=$(cd $( dirname ${BASH_SOURCE[0]}) && pwd )

Cette méthode ne fonctionne pas si la dernière partie du chemin est un lien symbolique. Pour traiter ce cas, il faut au préalable résoudre le lien symbolique. Pour cela, on va faire appel dans une boucle à la commande readlink qui lit la valeur d'un lien symbolique. On va également réutiliser la ligne de code précédente pour récupérer le répertoire qui contient le lien symbolique. On vérifiera également que le dossier n'est pas un chemin relatif.

SOURCE=${BASH_SOURCE[0]}
while [ -h $SOURCE ]; do # On cherche à résoudre $SOURCE jusqu'à que cette variable ne soit pas un lien symbolique
DIR=$( cd -P $( dirname $SOURCE ) && pwd )
SOURCE=$(readlink $SOURCE)
[[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE # if $SOURCE était un lien symbolique relatif, nous devons le modifier pour obtenir un chemin absolu
done
DIR=$( cd -P $( dirname $SOURCE ) && pwd )

Divers