Retour au cours

variables environnement

Objectifs

  • Distinguer une variable de shell locale d’une variable d’environnement.
  • Définir, lire et exporter des variables.
  • Comprendre le rôle fondamental de la variable PATH.
  • Ajouter un dossier personnel au PATH pour rendre ses propres scripts accessibles partout.

Explications détaillées

Notions clés

Variable de shell vs Variable d’environnement

C’est une distinction subtile mais capitale.

  • Variable de shell (locale) : Elle n’existe que dans le shell où elle a été créée. Les programmes ou les nouveaux shells que vous lancez depuis celui-ci n’en hériteront pas.
    • MA_VAR="valeur locale"
  • Variable d’environnement : C’est une variable qui a été “promue” pour être visible par tous les processus enfants lancés par le shell. Elle fait partie de l’environnement d’exécution.
    • export MA_VAR_ENV="valeur globale"

export, printenv et unset

  • export : La commande qui transforme une variable de shell en variable d’environnement (ou qui la crée directement comme telle).
  • printenv ou env : Affichent la liste de toutes les variables d’environnement actuellement définies.
  • unset : Supprime une variable (locale ou d’environnement).

La variable PATH : Le GPS des commandes

Quand vous tapez une commande comme ls, comment le shell sait-il où trouver le programme ls à exécuter ? Il regarde dans les dossiers listés dans la variable PATH.

PATH est une liste de chemins de dossiers, séparés par des deux-points (:).

echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Le shell parcourt cette liste dans l’ordre jusqu’à ce qu’il trouve un exécutable qui correspond au nom de la commande.

Les variables locale

Les variables comme LANG, LC_TIME, LC_NUMERIC contrôlent la langue, le format des dates, le séparateur décimal, etc.

echo $LANG fr_FR.UTF-8

Syntaxe / Usages

# Définir une variable locale
SALUTATION="Bonjour"

# La lire
echo $SALUTATION

# Exporter une variable pour la rendre globale
export API_KEY="secret123"

# Ajouter un dossier à la fin du PATH
export PATH="$PATH:/home/user/bin"

# Ajouter un dossier au début du PATH (prioritaire)
export PATH="/home/user/bin:$PATH"

# Supprimer une variable
unset SALUTATION

Exemples

# 1. Différence locale vs exportée

# Variable locale
MA_VAR_LOCALE="Je suis local"

# Lançons un nouveau shell. Cette commande crée un processus enfant.
bash

# Dans ce nouveau shell, essayons de lire la variable
echo $MA_VAR_LOCALE
# -> (rien ne s'affiche)

# Quittons ce nouveau shell pour revenir au parent
exit

# Maintenant, exportons une variable
export MA_VAR_GLOBALE="Je suis global"
bash
echo $MA_VAR_GLOBALE
# -> Je suis global
exit

# 2. Modifier le PATH
# Créons un script personnel
mkdir -p ~/scripts
echo 'echo "Mon script perso !"' > ~/scripts/salut
chmod +x ~/scripts/salut

# Essayons de le lancer depuis notre dossier personnel
salut
# -> command not found

# Ajoutons notre dossier au PATH
export PATH="$PATH:~/scripts"

# Essayons à nouveau
salut
# -> Mon script perso !

Bonnes pratiques

  • Utilisez des majuscules par convention pour les variables d’environnement (API_URL, LOG_LEVEL).
  • Ne modifiez le PATH qu’en ajoutant, jamais en l’écrasant (export PATH=... sans $PATH est une très mauvaise idée).
  • Pour rendre les changements permanents, ajoutez vos commandes export à la fin de votre fichier de configuration de shell (~/.bashrc sur la plupart des Linux, ou ~/.bash_profile / ~/.zshrc sur macOS).

Pièges courants

  • Oublier export : Le bug classique où un script ne fonctionne pas car il ne “voit” pas une variable définie juste avant son lancement.
  • Espaces autour du = : La syntaxe MA_VAR = "valeur" est invalide. Il ne doit y avoir aucun espace.
  • Mauvais ordre dans le PATH : Si vous placez un dossier “dangereux” au début de votre PATH, vous pourriez exécuter une version malveillante d’une commande standard (comme ls ou sudo). Placez toujours les dossiers personnels à la fin en général.

Exercices

  1. Variable de session :

    • Définissez une variable d’environnement PROJET_NOM avec la valeur “Mon Super Projet”.
    • Vérifiez qu’elle est bien présente avec printenv | grep PROJET_NOM.
    • Lancez un bash enfant, vérifiez qu’elle est toujours là, puis quittez avec exit.
    • Supprimez-la avec unset.
  2. Rendre un script global :

    • Créez un dossier ~/bin.
    • Créez un script info.sh dans ~/bin qui affiche “Date: date” et “Utilisateur: whoami”.
    • Rendez-le exécutable.
    • Modifiez votre PATH (pour la session courante) pour inclure ~/bin.
    • Déplacez-vous dans un autre dossier (ex: /tmp) et vérifiez que vous pouvez lancer info.sh directement.
  3. Variable de configuration :

    • Créez un script config_reader.sh qui affiche “Niveau de log : $LOG_LEVEL”.
    • Exécutez-le sans définir LOG_LEVEL.
    • Exécutez-le de cette manière : LOG_LEVEL="DEBUG" ./config_reader.sh. Observez que la variable est disponible pour ce seul lancement.