Gérer l'environnement et la configuration du Shell sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez acquérir les bases de la gestion de l'environnement et de la configuration du shell sous Linux. Vous commencerez par créer des variables locales et d'environnement, en utilisant des commandes telles que echo, export et env pour comprendre les différences fondamentales de leur portée et de leur disponibilité au sein d'une session shell.

En vous appuyant sur ces bases, vous explorerez comment les variables et les alias sont hérités par les shells enfants. Vous apprendrez également à contrôler l'exportation automatique des variables grâce à l'option set -o allexport et à rendre vos configurations personnalisées persistantes d'une session à l'autre en modifiant le fichier .bashrc.

Créer et différencier les variables locales et d'environnement

Dans cette étape, vous apprendrez à créer et à gérer les variables du shell. Dans un shell Linux comme Zsh, les variables servent à stocker des informations. Il en existe deux types principaux : les variables locales et les variables d'environnement.

  • Une variable locale (ou variable de shell) n'est disponible que dans le shell où elle a été créée.
  • Une variable d'environnement est disponible non seulement dans le shell actuel, mais aussi dans tous les processus enfants lancés à partir de ce shell.

Nous utiliserons les commandes echo, export et env pour les manipuler. Toutes les commandes seront exécutées dans le terminal.

Tout d'abord, créons une variable locale. Dans votre terminal, qui se trouve déjà dans le répertoire ~/project, tapez la commande suivante pour créer une variable nommée flower et lui assigner la valeur rose. Notez qu'il ne doit y avoir aucun espace autour du signe égal (=).

flower=rose

Pour vérifier que la variable a bien été créée, vous pouvez utiliser la commande echo pour afficher sa valeur. Le signe dollar ($) devant le nom de la variable indique au shell de remplacer la variable par sa valeur.

echo $flower

Vous devriez voir la valeur de la variable s'afficher dans le terminal :

rose

Maintenant, vérifions si cette variable locale fait partie de l'environnement du shell. La commande env liste toutes les variables d'environnement. Nous pouvons rediriger sa sortie vers grep pour rechercher notre variable.

env | grep flower

Cette commande ne produira aucune sortie. C'est le résultat attendu, et cela confirme que flower est une variable locale et non une variable d'environnement.

Ensuite, créons une variable d'environnement. Le processus est similaire, mais nous utilisons la commande export. Cette commande crée une variable et la marque pour qu'elle soit transmise à tous les processus enfants du shell actuel. Créons une variable d'environnement nommée nut avec la valeur almond.

export nut=almond

Vérifions-la avec echo comme nous l'avons fait précédemment.

echo $nut

La commande affichera la valeur de la variable nut :

almond

Maintenant, vérifions si elle existe dans l'environnement en utilisant à nouveau la commande env.

env | grep nut

Cette fois, la commande trouve et affiche la variable, confirmant que nut est bien une variable d'environnement :

nut=almond

Vous avez maintenant réussi à créer une variable locale et une variable d'environnement, et vous avez constaté la différence fondamentale dans la manière dont elles sont traitées par l'environnement du shell. Nous allons laisser ces variables définies pour les utiliser dans les étapes suivantes.

Tester l'héritage des variables et des alias dans un shell enfant

Dans cette étape, vous allez explorer le comportement des variables et des alias lorsque vous lancez un nouveau shell à partir de votre shell actuel. Ce nouveau shell est appelé "shell enfant", et le shell d'origine est le "shell parent". Ce concept est crucial pour comprendre comment les environnements shell sont structurés et comment les scripts s'exécutent. Nous allons tester si les variables flower et nut de l'étape précédente sont transmises, ou "héritées", par un shell enfant.

Tout d'abord, identifions l'identifiant de processus (PID) de notre shell parent actuel. Chaque processus sous Linux possède un PID unique. Vous pouvez l'afficher avec la commande echo $$.

echo $$

Votre sortie sera un nombre, qui est le PID de votre shell actuel. Par exemple :

123

Maintenant, lancez un shell enfant en tapant simplement zsh et en appuyant sur Entrée. Cela crée un nouveau processus shell à l'intérieur de votre processus actuel.

zsh

Vous êtes maintenant dans une nouvelle session shell. Pour le confirmer, nous pouvons utiliser la commande ps -f, qui affiche des informations détaillées sur les processus, y compris l'identifiant du processus parent (PPID).

ps -f

Regardez la sortie. Vous verrez deux processus zsh. Le PID du nouveau processus zsh devrait avoir un PPID qui correspond au PID du shell parent que vous avez noté précédemment.

UID          PID    PPID  C STIME TTY          TIME CMD
labex        123       1  0 10:00 pts/0    00:00:00 zsh
labex        456     123  0 10:01 pts/0    00:00:00 zsh
labex        457     456  0 10:01 pts/0    00:00:00 ps -f

Dans cet exemple, le nouveau shell (PID 456) est un enfant du shell d'origine (PPID 123).

Maintenant, testons les variables. Dans ce shell enfant, essayez d'afficher la valeur de la variable locale flower.

echo $flower

La commande ne produit aucune sortie. C'est parce que les variables locales sont confinées au shell dans lequel elles ont été créées et ne sont pas héritées par les shells enfants.

Ensuite, vérifiez la variable d'environnement nut.

echo $nut

Cette fois, le shell affiche la valeur de la variable :

almond

Cela démontre que les variables d'environnement, contrairement aux variables locales, sont héritées par les shells enfants.

Maintenant, retournons au shell parent en utilisant la commande exit.

exit

Vous êtes de retour dans votre shell d'origine. Effectuons un test similaire avec un alias. Un alias est un raccourci pour une commande. Créez un alias nommé ldetc qui exécute ls -ld /etc.

alias ldetc='ls -ld /etc'

Vérifiez que l'alias a été créé en tapant alias.

alias ldetc

Vous devriez voir la définition de votre alias :

ldetc='ls -ld /etc'

Maintenant, testez l'alias en l'exécutant.

ldetc

La commande exécutera ls -ld /etc et vous montrera les détails du répertoire /etc.

drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc

Maintenant, ouvrez un autre shell enfant pour voir si l'alias est hérité.

zsh

À l'intérieur du nouveau shell enfant, essayez d'utiliser l'alias ldetc.

ldetc

Vous recevrez un message d'erreur, car les alias, tout comme les variables locales, ne sont pas hérités par les shells enfants.

zsh: command not found: ldetc

Retournez au shell parent.

exit

Enfin, faisons un peu de nettoyage en supprimant l'alias du shell parent à l'aide de la commande unalias.

unalias ldetc

Vérifiez sa suppression en essayant de le lister à nouveau.

alias ldetc

Rien n'est renvoyé.

Cet exercice vous a montré un principe clé du comportement du shell : les variables d'environnement sont héritées par les processus enfants, mais pas les variables locales ni les alias.

Contrôler l'exportation automatique des variables avec set -o allexport

Dans cette étape, vous allez découvrir une option puissante du shell appelée allexport. Normalement, lorsque vous créez une variable, vous devez explicitement utiliser la commande export pour en faire une variable d'environnement. Cependant, en activant l'option allexport, vous pouvez demander au shell d'exporter automatiquement chaque nouvelle variable que vous définissez. Cela peut être un raccourci pratique, en particulier dans les scripts où toutes les variables doivent être disponibles pour les sous-processus.

Les options du shell sont des paramètres internes qui modifient le comportement de votre shell. Vous pouvez les activer avec set -o [nom_option] et les désactiver avec set +o [nom_option].

Tout d'abord, vérifions l'état actuel de l'option allexport. Vous pouvez lister toutes les options du shell et filtrer pour allexport en utilisant grep.

set -o | grep allexport

Par défaut, cette option est désactivée. La sortie affichera son état comme off :

allexport              off

Maintenant, activons l'option allexport.

set -o allexport

Vérifiez que le paramètre a été modifié en exécutant à nouveau la commande de vérification.

set -o | grep allexport

Cette fois, la sortie confirmera que l'option est on :

allexport              on

Avec allexport activé, toute variable que vous créez deviendra automatiquement une variable d'environnement. Testons cela. Créez une nouvelle variable nommée truck sans utiliser la commande export.

truck=chevy

Maintenant, vérifiez si truck existe dans l'environnement à l'aide de la commande env.

env | grep truck

Vous verrez que la variable truck est listée, même si vous n'avez pas utilisé export. C'est parce que l'option allexport était active.

truck=chevy

Cette fonctionnalité peut être très utile, mais il est de bonne pratique de la désactiver lorsque vous n'en avez plus besoin afin d'éviter d'exporter involontairement des variables. Désactivons allexport.

set +o allexport

Enfin, vérifiez qu'elle a bien été désactivée.

set -o | grep allexport

La sortie montrera à nouveau que l'option est off.

allexport              off

Toutes les nouvelles variables que vous créerez à partir de maintenant seront des variables locales par défaut, à moins que vous n'utilisiez explicitement la commande export.

Rendre les options du shell persistantes à l'aide du fichier .bashrc

Dans cette étape, vous apprendrez comment rendre vos personnalisations du shell permanentes. Tous les alias, fonctions ou options de shell que vous définissez sont temporaires et seront perdus lorsque vous fermerez votre session de terminal. Pour les enregistrer de manière permanente, vous devez les ajouter à un fichier de configuration du shell.

Bien que le titre mentionne .bashrc, qui est le fichier de configuration du shell Bash, notre environnement d'atelier utilise le shell Zsh. Le fichier de configuration équivalent pour Zsh est ~/.zshrc. Ce fichier est un script qui s'exécute automatiquement chaque fois que vous ouvrez un nouveau shell interactif, ce qui en fait l'endroit idéal pour stocker vos paramètres personnels.

Nous allons mettre cela en pratique en rendant permanente l'option de shell noclobber. L'option noclobber vous empêche d'écraser accidentellement un fichier existant lors de l'utilisation de la redirection de sortie (>).

Tout d'abord, utilisons l'éditeur de texte nano pour ajouter l'option noclobber à votre fichier ~/.zshrc. Le symbole ~ est un raccourci pour votre répertoire personnel, /home/labex.

nano ~/.zshrc

Cette commande ouvre le fichier ~/.zshrc dans l'éditeur nano. Utilisez les touches fléchées pour déplacer le curseur tout à la fin du fichier et ajoutez la ligne suivante :

set -o noclobber

Maintenant, enregistrez le fichier et quittez nano. Pour ce faire, appuyez sur Ctrl+O (Write Out), appuyez sur Enter pour confirmer le nom du fichier, puis appuyez sur Ctrl+X pour quitter.

Vous êtes maintenant de retour à l'invite de commande. Vérifions si l'option noclobber est active dans votre shell actuel.

set -o | grep noclobber

La sortie sera :

noclobber              off

Pourquoi est-elle désactivée ? Parce que votre session shell actuelle n'a pas encore lu les modifications que vous venez d'apporter au fichier ~/.zshrc. Le fichier n'est lu qu'au démarrage d'un nouveau shell.

Pour le prouver, lançons un nouveau shell enfant.

zsh

Vous êtes maintenant dans un nouveau shell. Vérifions l'état de noclobber ici.

set -o | grep noclobber

Cette fois, la sortie sera :

noclobber              on

Cela confirme que les nouveaux shells lisent correctement le fichier ~/.zshrc et appliquent les paramètres. Maintenant, quittez le shell enfant pour revenir à votre shell parent d'origine.

exit

Alors, comment pouvez-vous appliquer les modifications à votre shell actuel sans le fermer et le rouvrir ? Vous pouvez utiliser la commande source, qui lit et exécute les commandes d'un fichier dans le contexte du shell actuel.

source ~/.zshrc

La commande source a maintenant exécuté la ligne set -o noclobber de votre fichier de configuration. Vérifions que noclobber est maintenant activé dans notre shell d'origine.

set -o | grep noclobber

La sortie sera désormais :

noclobber              on

Vous avez appris avec succès comment pérenniser les paramètres du shell en modifiant le fichier ~/.zshrc et comment appliquer ces modifications à votre session actuelle à l'aide de la commande source.

Résumé

Dans cet atelier, vous avez appris les concepts fondamentaux de la gestion de l'environnement du shell Linux. Vous vous êtes exercé à créer des variables locales, confinées au shell actuel, et des variables d'environnement, héritées par tous les processus enfants. Des commandes clés telles que echo pour afficher les valeurs des variables, export pour créer des variables d'environnement et env pour les lister ont été utilisées. Le concept d'héritage a été approfondi en lançant un shell enfant pour tester quelles variables et quels alias étaient transmis avec succès depuis le shell parent.

De plus, vous avez exploré des méthodes pour contrôler et pérenniser la configuration de votre shell. Vous avez utilisé l'option set -o allexport pour exporter automatiquement toutes les variables définies ultérieurement, simplifiant ainsi leur mise à disposition pour les processus enfants. Pour garantir que vos variables personnalisées, vos alias et vos options de shell soient disponibles dans toutes vos futures sessions de terminal, vous avez appris à ajouter ces configurations au fichier de démarrage .bashrc (ou .zshrc), rendant ainsi les personnalisations de votre environnement permanentes.