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
PATHpour 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).printenvouenv: 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
PATHqu’en ajoutant, jamais en l’écrasant (export PATH=...sans$PATHest une très mauvaise idée). - Pour rendre les changements permanents, ajoutez vos commandes
exportà la fin de votre fichier de configuration de shell (~/.bashrcsur la plupart des Linux, ou~/.bash_profile/~/.zshrcsur 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 syntaxeMA_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 votrePATH, vous pourriez exécuter une version malveillante d’une commande standard (commelsousudo). Placez toujours les dossiers personnels à la fin en général.
Exercices
-
Variable de session :
- Définissez une variable d’environnement
PROJET_NOMavec la valeur “Mon Super Projet”. - Vérifiez qu’elle est bien présente avec
printenv | grep PROJET_NOM. - Lancez un
bashenfant, vérifiez qu’elle est toujours là, puis quittez avecexit. - Supprimez-la avec
unset.
- Définissez une variable d’environnement
-
Rendre un script global :
- Créez un dossier
~/bin. - Créez un script
info.shdans~/binqui 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 lancerinfo.shdirectement.
- Créez un dossier
-
Variable de configuration :
- Créez un script
config_reader.shqui 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.
- Créez un script