Aller au contenu

Variables d'environnement

Quand tu ouvres un terminal, ton shell ne part pas d’une page blanche. Il dispose d’un ensemble de variables d’environnement. Ce sont des paires <CLÉ>=<valeur> qui configurent le comportement du shell et celui des programmes qu’il lance.

Fenêtre de terminal
echo $HOME # /home/lelafontant — ton répertoire personnel
echo $USER # lelafontant — ton nom d'utilisateur
echo $SHELL # /bin/bash — ton shell actif
echo $LANG # en_US.UTF-8 — ta langue et ton encodage
env # Affiche toutes les variables d'environnement
printenv PATH # Affiche la valeur d'une variable spécifique

Avant même que tu tapes quoi que ce soit, le shell dispose déjà de dizaines de variables configurées par le système.

VariableExemple de valeurRôle
PATH/usr/local/bin:/usr/bin:/binRépertoires où le shell cherche les commandes
HOME/home/lelafontantRépertoire personnel de l’utilisateur
USERlelafontantNom de l’utilisateur courant
SHELL/bin/bashShell par défaut de l’utilisateur
PWD/home/lelafontant/projetRépertoire de travail actuel
LANGen_US.UTF-8Langue et encodage du système
HOSTNAMElelafontant-VMware-Virtual-PlatformNom de la machine
Fenêtre de terminal
echo $HOME # /home/lelafontant
echo $USER # lelafontant
env # Affiche TOUTES les variables d'environnement
printenv PATH # Affiche la valeur d'une variable spécifique

Par défaut, une variable définie dans le shell est locale. Elle n’existe que dans la session courante et n’est pas transmise aux programmes que tu lances depuis ce shell.

Fenêtre de terminal
MA_COULEUR="bleu"
echo $MA_COULEUR # bleu
bash -c 'echo $MA_COULEUR' # (rien) — le sous-shell ne la voit pas

La commande export rend la variable disponible pour tout programme lancé depuis ce shell. Sans export, la variable reste confinée.

Fenêtre de terminal
export MA_COULEUR="bleu"
bash -c 'echo $MA_COULEUR' # bleu — le sous-shell en hérite

Si tu crées une variable qui porte le même nom qu’une variable prédéfinie, ta valeur écrase l’ancienne sans avertissement :

Fenêtre de terminal
echo $USER # lelafontant
export USER="intrus"
echo $USER # intrus — la valeur originale est perdue dans cette session

Le shell ne fait aucune distinction entre « variable système » et « variable personnelle » — c’est le même mécanisme. C’est pourquoi la convention de nommage est si importante : en utilisant des MAJUSCULES pour les variables système et des noms spécifiques à ton projet pour les tiennes (par exemple APP_PORT plutôt que PORT), tu réduis le risque de collision.

Tu seras parfois amené à modifier la valeur de certaines variables, même celle prédéfinie. Par exemple, tu modifieras souvent PATH pour ajouter des répertoires de commandes. Tu peux aussi changer EDITOR pour définir ton éditeur préféré, ou LANG pour changer la langue des messages d’erreur.

En faisant simplement un nouvel export ciblant la variable, tu modifies sa valeur:

Fenêtre de terminal
export EDITOR="vim" # Changer l'éditeur par défaut
export LANG="en_US.UTF-8" # Passer les messages en anglais
export PATH="$PATH:/mon/dossier" # Ajouter un répertoire au PATH

Pour supprimer une variable, même prédéfinie, on utilise la commande unset :

Fenêtre de terminal
unset EDITOR # Supprime la variable EDITOR
echo $EDITOR # (rien)

La variable disparaît de la session courante et n’est plus transmise aux processus enfants.

PATH est la variable d’environnement la plus importante pour le fonctionnement quotidien du terminal.
Elle contient une liste de répertoires, séparés par :, dans lesquels le shell cherche les commandes que tu tapes.

/usr/sbin
echo $PATH

Pour ajouter un répertoire au PATH :

Fenêtre de terminal
export PATH="$PATH:/home/lelafontant/mes-scripts"

Cette syntaxe ajoute ton répertoire à la fin du PATH existant. Si tu le mettais au début (export PATH="/home/lelafontant/mes-scripts:$PATH"), tes commandes personnelles seraient trouvées avant les commandes système — utile mais potentiellement risqué.

Quand tu tapes ls, le shell ne cherche pas dans tout le disque. Il parcourt les répertoires listés dans PATH, dans l’ordre, et exécute le premier fichier ls qu’il trouve.

Fenêtre de terminal
which ls # /usr/bin/ls — montre OÙ le shell a trouvé la commande
which node # /usr/local/bin/node

La commande which trouve le chemin de l’exécutable que le shell utiliserait.

Fenêtre de terminal
which python3 # /usr/bin/python3
which code # /usr/bin/code

La commande type est plus complet. Elle distingue les commandes internes, alias et fichiers.

Fenêtre de terminal
type cd # cd is a shell builtin — commande intégrée au shell
type ls # ls is aliased to 'ls --color=auto' — alias
type node # node is /usr/local/bin/node — fichier exécutable

La différence entre which et type est subtile mais importante:

  • which ne connaît que les fichiers exécutables dans le PATH.
  • type connaît tout ce que le shell sait exécuter : les commandes internes (cd, echo, export), les alias, les fonctions, et les fichiers.

La commande whereis trouve l’exécutable, le code source ET les pages de manuel

Fenêtre de terminal
whereis nginx # nginx: /usr/sbin/nginx /etc/nginx /usr/share/man/man8/nginx.8.gz

Les variables définies avec export dans le terminal disparaissent quand tu fermes la session. Pour qu’elles soient disponibles à chaque connexion, tu dois les placer dans un fichier de configuration du shell.

FichierQuand il est luUsage typique
~/.profileÀ la connexion (login shell)Variables d’environnement globales (PATH, EDITOR)
~/.bashrcÀ chaque ouverture de terminal (interactive shell)Alias, fonctions, personnalisation du prompt
Fenêtre de terminal
# Ajouter Node.js au PATH de façon permanente
echo 'export PATH="$PATH:/home/lelafontant/.npm-global/bin"' >> ~/.bashrc
# Recharger sans fermer le terminal
source ~/.bashrc

En développement web, les variables d’environnement jouent un rôle central dans la configuration des applications. Plutôt que de coder en dur l’adresse de la base de données ou le port du serveur, on les lit depuis l’environnement.

Fenêtre de terminal
# Lancer un serveur Node.js sur un port personnalisé
export PORT=3000
export DB_HOST="localhost"
export NODE_ENV="development"
node server.js
// server.js — lecture des variables en Node.js
const port = process.env.PORT || 8080;
const dbHost = process.env.DB_HOST || 'localhost';
const isProd = process.env.NODE_ENV === 'production';

Ceci permet d’exécuter correctement le même code dans plusieurs environnements, mais également de le personnaliser en modifiant les variables environnementales.
Cela évite également de rendre public (dans un dépot Github par exemple) des informations sensibles ou privées comme les clés API et les mots de passe.