Recherche de site Web

Comment découvrir, à partir de l’intérieur d’un script bash, le chemin d’accès du script


Lorsque vous développez des scripts Bash complexes et que vous commencez à placer plusieurs scripts dans un dossier, où un script interagit avec un autre, par exemple en le démarrant, il devient rapidement nécessaire de s’assurer que nous connaissons le chemin d’accès à partir duquel le script a été démarré, afin que nous puissions démarrer les autres scripts avec un chemin d’accès complet. Ceci est important car le premier script peut avoir été démarré en dehors du répertoire du script. Nous aurions également pu le faire en utilisant un chemin relatif, de sorte que même – d’une manière ou d’une autre – la lecture de la commande qui a démarré le script actuel ne fonctionnera pas.

Dans ce tutoriel, vous allez apprendre :

  • Qu’est-ce que la commande pwd et à quoi sert-elle ?
  • Comment découvrir à partir de l’intérieur d’un script Bash dans quel chemin se trouve ce même script

Comment découvrir, à partir de l’intérieur d’un script bash, le chemin d’accès du script

Configuration logicielle requise et conventions utilisées

Qu’est-ce que le pwd ?

La commande pwd sous Linux renvoie le répertoire de travail du chemin d’accès lorsqu’elle est exécutée. Quel que soit le chemin dans lequel nous nous trouvons actuellement, et vers lequel nous avons précédemment navigué (ou dans lequel nous avons été placés par notre système d’exploitation, comme, par exemple, lorsque nous ouvrons une invite de commande/terminal), ce sera ce qui est renvoyé lorsque nous exécutons pwd.

cd /
pwd
/
cd /home
pwd
/home

Ici, nous avons changé pour le répertoire racine (/) et exécuté pwd. Notre chemin d’accès actuel était le répertoire racine, donc / est renvoyé. Nous avons ensuite changé pour le répertoire /home et exécuté à nouveau pwd. Le chemin renvoyé est maintenant /home.

À l’intérieur d’un script bash, la commande pwd fonctionnera de la même manière. Il est également intéressant de savoir qu’à partir de l’intérieur d’un script Bash (et sur la ligne de commande en dehors d’un script Bash également), nous pouvons utiliser la variable spéciale du système d’exploitation $ {PWD} qui sera automatiquement maintenue à jour par le système d’exploitation pour contenir notre chemin actuel. Cela nous évite d’avoir à faire quelque chose comme appeler un sous-shell, c’est-à-dire que MYPATH="$ (pwd) » n’est pas nécessaire, nous pouvons simplement invoquer la variable $ {PWD}.

Nous pouvons donc utiliser pwd, n’est-ce pas ?

Pas exactement. Imaginez la situation suivante :

touch 'mypath.sh'
echo '#!/bin/bash' >> mypath.sh
echo 'echo ${PWD}' >> mypath.sh
chmod +x mypath.sh 

Ici, nous avons défini un script nommé mypath.sh et l’avons rendu exécutable. Ensuite, nous sautons un répertoire de notre répertoire personnel et exécutons notre script :

pwd 
/home/roel
cd ..
./roel/mypath.sh 
/home

Alors que la commande pwd à l’intérieur de notre script mypath.sh fonctionne correctement, il y a un problème ici : pwd a renvoyé le chemin dans lequel nous nous trouvons actuellement, à savoir /home alors que le script est en fait stocké dans le répertoire /home/roel !

N’oubliez pas le titre de l’article ; Nous recherchons le chemin dans lequel le script est stocké ! Alors, comment pouvons-nous trouver cela ?

La méthode !

Alors qu’il n’y a pas de variable spéciale dans Bash pour couvrir le chemin dans lequel le script est stocké, il existe une méthode simple pour l’obtenir.

cd -
/home/roel
touch 'mypath2.sh'
echo '#!/bin/bash' >> mypath2.sh
echo 'MYPATH="$(cd "$(dirname \$0)" && pwd)"' >> mypath2.sh 
echo 'echo "${MYPATH}"' >> mypath2.sh
chmod +x mypath2.sh 

Ici, nous avons défini un script secondaire nommé mypath2.sh. À l’intérieur, nous plaçons un petit code spécial (&#36 (cd « &#36 (dirname \$0) » ; && pwd))) qui trouvera le chemin dans lequel se trouve le script (en changeant dans son répertoire, basé sur la variable \$0 (qui est le nom du script de la manière dont nous l’avons appelé, c’est-à-dire en utilisant un chemin potentiel relatif ou complet) et en demandant le dirname pour celui-ci (par référence, et notez qu’il peut toujours s’agir d’un chemin relatif si le script a été démarré en utilisant un chemin relatif), puis en le modifiant (via le CD) et en demandant ensuite le pwd (Path Working Directory) pour la même chose, nous donnant le chemin complet.

Voyons si cela fonctionne plus correctement que d’utiliser uniquement pwd :

cd ..
pwd
/home
./home/mypath2.sh 
/home/roel

Le script fonctionne correctement, et même s’mypath2.sh a été relativement appelé, en dehors du répertoire où réside le script, la sortie renvoyée reflétait correctement les informations recherchées ; chemin d’accès où se trouve le script. Nous avons stocké la même chose dans la variable $ {MYPATH}, et cette variable pourrait maintenant être utilisée pour appeler par exemple $ {MYPATH}/someotherscript.sh où someotherscript.sh est un autre script dans le même répertoire que mypath2.sh

Conclusion

Dans cet article, nous examinons d’abord pwd et si cela résoudrait le problème en question, en découvrant le chemin dans lequel se trouve notre script, à tout moment. Alors que pwd peut fonctionner si nous n’avons pas changé de répertoire, il ne fonctionnera pas correctement si nous sommes en dehors du chemin dans lequel se trouve le script. Nous avons ensuite introduit un petit morceau de code (MYPATH="&#36 (cd « &#36 (dirname \$0) » && pwd) » qui renverra toujours correctement le répertoire dans lequel se trouve notre script.

Un petit morceau de code, mais une grande solution à notre problème de codage de script Bash ! Prendre plaisir !

Articles connexes: