Scripts shell Linux de base : changer de répertoire dans les scripts shell 🐧↓
Vous souhaiterez peut-être exécuter un script shell qui modifie votre répertoire de travail actuel vers un autre répertoire pour plus de commodité.
Par exemple, si vous visitez fréquemment votre répertoire de documents (~/Documents) et que vous souhaitez y accéder rapidement, vous pouvez écrire un script Bash pour le faire.
Dans ce fil de discussion, je vais vous montrer comment procéder avec la commande cd. J'expliquerai également certaines complexités du comportement de cd.
🐧 Un problème courant. Commençons par un script qui accède au répertoire ~/Documents. Je l'appellerai https://t.co/C30eEhxKsc :
🐧 Décomposer notre code : • cd /home/linuxopsys/Documents - change le répertoire de travail actuel en ~/Documents. • pwd - imprime le répertoire de travail. • echo $$ - $$ est une variable interne Bash contenant l'ID de processus (PID) du shell qui exécute votre script.
🐧 Exécution de notre script Comme nous pouvons le voir, l'exécution de notre script génère la sortie attendue de /home/linuxopsys/Documents ainsi que l'ID de processus du shell.
Vérification pour voir où nous en sommes maintenant que le script a été exécuté.
Vous pouvez clairement constater que notre répertoire n'a pas changé. Nous ne nous attendions pas à cela, car le répertoire courant n'était pas /home/linuxopsys/Documents. Quel pourrait être le problème ? Examinons l'ID de processus de notre shell :
Nous pouvons clairement voir que l'ID de processus du shell dans lequel nous nous trouvons (PID 4504) et le script shell (PID 4574) sont totalement différents.
Il s'agit d'un comportement courant. Le script est exécuté dans son propre shell indépendant (sous-shell/shell enfant). À la fin du script, ce shell distinct se ferme, laissant le shell parent, dans lequel nous nous trouvons actuellement, et qui n'est pas affecté.
La question est maintenant : comment résoudre ce problème ? Poursuivez votre lecture.
🐧 Exécution de scripts dans le shell parent Nous pouvons utiliser la commande source pour permettre à notre script d'exécuter des commandes dans le shell actuel (shell parent).
La commande source exécute les commandes dans le contexte du shell actuel, sans avoir à démarrer un nouveau shell. L'opérateur point est un raccourci pour la commande source (.). Parfait ! Nous pouvons ainsi exécuter un script bash dans le shell actuel. Essayons ceci :
L'extrait ci-dessus montre clairement que le PID du script est celui du shell parent qui l'a exécuté, et le répertoire actuel de notre shell parent est désormais ~/Documents.
Bien ! Jusqu'à présent, nous avons montré qu'il est possible d'exécuter des scripts shell dans le shell actuel en utilisant la source. Nous aurions également pu utiliser l'opérateur abrégé .
🐧 Utilisation des fonctions Bash. Écrire un script Bash pour chaque répertoire est fastidieux. Nous pourrions combiner plusieurs commandes Bash en un seul script :
Maintenant, si nous récupérons la source du fichier, nous pouvons utiliser les fonctions du script dans notre terminal actuel.
🐧 Utilisation des alias. Grâce à la commande intégrée alias, nous pouvons améliorer encore nos fonctions Bash. Comme elle nécessite moins de saisie, un alias est plus pratique à utiliser qu'une fonction. Convertissons nos fonctions en leurs variantes d'alias :
En comparant cette fonction aux fonctions bash précédentes, on constate sa concision. De plus, l'alias peut être utilisé de la même manière que les fonctions.
Voilà ! Dans ce fil de discussion, nous avons vu plusieurs façons d'utiliser la commande cd dans les scripts Bash.
Pour commencer, nous avons découvert que l'exécution d'un script shell initie son propre processus. Enfin, nous avons étudié comment les fonctions et la commande alias pouvaient nous aider à améliorer nos scripts Bash.
Merci d'être arrivé jusqu'ici et j'espère que vous avez trouvé ce fil utile. Vos commentaires sont vraiment appréciés.
Suivez-nous sur @linuxopsys si vous avez aimé ce fil de discussion ! Nous tweeterons quotidiennement sur Linux, l'administration système et le DevOps.