Introduction
Les programmes ont souvent besoin de petits éléments de configuration : un répertoire personnel, une langue, un chemin de recherche ou un paramètre d’application. Les processus Linux reçoivent beaucoup de ces valeurs par l’intermédiaire d’un environnement, c’est-à-dire un ensemble de chaînes nommées.
Ce laboratoire présente cette notion progressivement. Vous allez d’abord créer une variable qui n’appartient qu’au shell actuel, puis exporter une variable vers les processus enfants, examiner des variables standard, étendre PATH et faire apparaître des paramètres dans les futures sessions Zsh. Chaque étape produit un fichier ou un résultat de commande observable afin que vous puissiez vérifier ce que le shell a réellement fait.
Créer et développer une variable du shell
Dans cette étape, vous allez créer une variable du shell et observer l’effet des guillemets sur son développement.
Une variable du shell associe un nom à une valeur dans le shell actuel. La syntaxe d’affectation ne comporte aucun espace autour de =. Les guillemets autour de la valeur préservent l’espace qu’elle contient :
cd /home/labex/project/environment-lab
course_name="Linux for Noobs"
Le préfixe $ demande au shell de développer le nom en sa valeur :
echo "$course_name"
Les guillemets doubles autorisent le développement et conservent le résultat comme un seul argument. Les guillemets simples conservent littéralement le signe dollar. Comparez les deux comportements :
printf 'double: %s\n' "$course_name"
printf 'single: %s\n' '$course_name'
Enregistrez la valeur développée dans un fichier pour obtenir un résultat vérifiable :
printf 'course=%s\n' "$course_name" > shell-variable.txt
cat shell-variable.txt
Cette variable existe uniquement dans le shell actuel, sauf si vous l’exportez.
Observer l’héritage par un processus enfant
Dans cette étape, vous allez comparer une variable ordinaire du shell et une variable exportée à l’intérieur d’un processus enfant.
Chaque commande s’exécute dans un processus. Un processus enfant reçoit les variables d’environnement exportées par son processus parent, mais pas les variables ordinaires du shell.
Revenez dans l’espace de travail et créez une variable de chaque type :
cd /home/labex/project/environment-lab
local_message="visible only in this shell"
export SHARED_MESSAGE="visible in child processes"
Créez un petit processus enfant Bash qui affiche les deux noms. Le marqueur de heredoc entre guillemets empêche le shell actuel de développer les variables pendant l’écriture du script :
cat > inspect-child.sh <<'EOF'
#!/bin/bash
printf 'local=%s\n' "${local_message:-<missing>}"
printf 'shared=%s\n' "${SHARED_MESSAGE:-<missing>}"
EOF
chmod +x inspect-child.sh
Exécutez le script et redirigez sa sortie vers un fichier, puis affichez ce fichier. Le fait de séparer ces actions permet de distinguer clairement l’exécution du processus enfant de l’inspection du résultat enregistré :
./inspect-child.sh > child-environment.txt
cat child-environment.txt
La variable ordinaire apparaît sous la forme <missing>, tandis que SHARED_MESSAGE est héritée. Vérifiez que le nom exporté est présent dans l’environnement :
env | grep '^SHARED_MESSAGE='
Examiner les variables d’environnement standard
Dans cette étape, vous allez examiner les variables standard qui décrivent votre compte, votre répertoire de travail, votre terminal et le chemin de recherche des commandes.
Les shells Linux fournissent généralement plusieurs variables standard utiles :
HOMEest votre répertoire personnel.USERest le nom de votre compte.SHELLest votre shell de connexion configuré.PWDindique le répertoire de travail actuel.PATHcontient les répertoires de recherche des commandes, séparés par des deux-points.TERMdécrit les capacités du terminal pour les programmes interactifs.
Affichez certaines valeurs avec printenv, qui lit les variables exportées en indiquant leur nom :
printenv HOME USER SHELL PWD TERM
PATH est plus facile à lire avec une entrée par ligne. Envoyez sa valeur à tr pour remplacer chaque deux-points par un saut de ligne :
printf '%s\n' "$PATH" | tr ':' '\n'
Créez un rapport stable à partir des variables dont les valeurs attendues sont connues dans ce laboratoire :
cd /home/labex/project/environment-lab
printf 'HOME=%s\nUSER=%s\n' "$HOME" "$USER" > standard-environment.txt
cat standard-environment.txt
Étendre PATH avec une commande personnelle
Dans cette étape, vous allez ajouter un répertoire personnel d’exécutables à PATH, puis exécuter une commande par son nom depuis un autre répertoire.
Lorsque vous saisissez une commande sans barre oblique, le shell recherche cette commande dans les répertoires de PATH, de gauche à droite. Vous pouvez ajouter un répertoire personnel d’exécutables sans remplacer le chemin de recherche existant.
Créez une commande nommée course-status :
mkdir -p "$HOME/bin"
cat > "$HOME/bin/course-status" <<'EOF'
#!/bin/bash
echo "Linux learning environment is ready"
EOF
chmod +x "$HOME/bin/course-status"
Ajoutez le répertoire à la fin du PATH actuel. La conservation de $PATH maintient l’accès aux commandes standard :
export PATH="$PATH:$HOME/bin"
Demandez au shell quel fichier il exécutera, puis lancez la commande depuis un autre répertoire :
command -v course-status
cd /tmp
course-status
Enregistrez sa sortie dans l’espace de travail du laboratoire :
course-status > /home/labex/project/environment-lab/path-command.txt
Conserver les paramètres pour les futures sessions Zsh
Dans cette étape, vous allez configurer les futures sessions Zsh et distinguer la configuration persistante de l’état du shell actuel.
L’exportation modifie le processus actuel et ses futurs processus enfants ; elle ne modifie pas un fichier de configuration. Un paramètre apparaît dans les terminaux ouverts ultérieurement uniquement lorsqu’un fichier de démarrage le recrée. Le terminal LabEx utilise Zsh, dont le fichier de démarrage des sessions interactives est ~/.zshrc.
Ajoutez un bloc clairement délimité. Chaque ligne export recrée un paramètre d’environnement chaque fois qu’un nouveau Zsh interactif démarre. Cette version destinée aux débutants reste volontairement directe : elle conserve le PATH existant, puis ajoute le répertoire personnel à la fin.
cat >> "$HOME/.zshrc" <<'EOF'
## LABEX_ENV_LAB_START
export PROJECT_DIR="$HOME/project"
export PATH="$PATH:$HOME/bin"
## LABEX_ENV_LAB_END
EOF
La commande source lit un fichier dans le shell actuel. Rechargez maintenant .zshrc afin d’utiliser ses paramètres sans fermer le terminal :
source "$HOME/.zshrc"
Vérifiez que la variable rechargée est disponible :
printf 'PROJECT_DIR=%s\n' "$PROJECT_DIR"
Vous devez voir PROJECT_DIR=/home/labex/project. Vous pouvez également démarrer un nouveau processus Zsh pour vérifier qu’une future session charge les mêmes paramètres. Dans zsh -ic, -i demande un shell interactif afin que .zshrc soit lu, et -c fournit la commande que ce shell doit exécuter. Redirigez ses deux lignes de sortie vers future-shell.txt, puis examinez le fichier :
zsh -ic 'printf "PROJECT_DIR=%s\n" "$PROJECT_DIR"; command -v course-status' > /home/labex/project/environment-lab/future-shell.txt
cat /home/labex/project/environment-lab/future-shell.txt
La première ligne doit afficher /home/labex/project ; la seconde doit afficher /home/labex/bin/course-status.
Enfin, observez la différence entre l’état actuel et la configuration persistante. Créez et supprimez une variable d’environnement temporaire :
export TEMP_NOTE="remove me"
printenv TEMP_NOTE
unset TEMP_NOTE
printenv TEMP_NOTE
La dernière commande printenv ne produit aucune sortie et renvoie un code d’état différent de zéro, car le nom n’existe plus. unset supprime le nom du shell actuel. Si un nom est toujours défini dans un fichier de démarrage, un futur shell le recréera jusqu’à la suppression de la ligne correspondante dans cette configuration.
Résumé
Vous avez observé les trois mécanismes souvent confondus : une variable du shell appartient à un seul shell, export transmet une valeur aux processus enfants et un fichier de démarrage recrée des paramètres dans les futurs shells. Vous avez également examiné des variables d’environnement standard, étendu PATH sans perdre ses entrées existantes, vérifié la recherche d’une commande et supprimé un état temporaire avec unset.



