Env
| Fiche express | |
|---|---|
| Domaine | Variables d'environnement |
| Commande | env
|
| Contexte | Afficher/modifier l'environnement d'un processus, sans toucher au shell courant |
| Voir aussi | Bashrc (persistance des variables) |
env affiche les variables d'environnement du shell courant, ou exécute une commande dans un environnement modifié (variable ajoutée/changée, ou environnement complètement vidé avec -i) sans polluer le shell appelant. Très utile pour tester une variable ponctuellement (proxy, locale, chemin) ou déboguer un script sensible à son environnement.
Afficher l'environnement
env # liste toutes les variables d'environnement exportées
env | sort # triées par ordre alphabétique, plus lisible
env | grep -i proxy # filtrer sur un motif (ici les variables de proxy)
env seul est proche de export -p, mais ne liste que les variables réellement exportées vers les processus enfants, pas les variables shell locales.
Exécuter une commande avec une variable modifiée
env VAR=valeur commande exécute commande avec VAR positionnée à valeur pour cette seule invocation, sans modifier le shell courant ni les commandes suivantes :
env TZ=Europe/Paris date # date affichée dans un autre fuseau, ponctuellement
env LANG=C sort fichier.txt # tri en locale C, indépendant de la locale du shell
env DEBUG=1 ./mon_script.sh # activer un flag de debug pour un seul run
Plusieurs variables peuvent être passées d'un coup, avant la commande à exécuter :
env VAR1=un VAR2=deux commande
Environnement vierge avec env -i
env -i lance une commande avec un environnement complètement vide (aucune variable héritée du shell), utile pour reproduire un contexte minimal — cron, service systemd, script appelé par un outil tiers — et déboguer un script qui se comporte différemment selon les variables présentes :
env -i bash --noprofile --norc # shell interactif sans aucune variable héritée
env -i PATH=/usr/bin:/bin ./script.sh # environnement vierge, seul PATH est fourni
⚠️ Avec env -i, même PATH disparaît : sans le redéfinir, la commande à exécuter doit être appelée avec son chemin complet, sous peine de command not found.
Exemple : proxy HTTP
Les clients réseau en ligne de commande (curl, wget, apt, git...) respectent en général les variables http_proxy/https_proxy, et no_proxy pour les exceptions :
# ponctuel, une seule commande, ne pollue pas le shell
env https_proxy=http://user:pass@proxy.example.org:3128 curl -I https://example.com
# pour la session en cours (shell courant et sous-processus)
export http_proxy=http://user:pass@proxy.example.org:3128
export https_proxy=$http_proxy
export no_proxy=localhost,127.0.0.1,.example.local
no_proxy accepte une liste de domaines/IP séparés par des virgules — ils seront joints en direct, sans passer par le proxy. Certains outils (Java, quelques paquets) attendent les variantes en majuscules (HTTP_PROXY, HTTPS_PROXY, NO_PROXY) : les définir en double si un outil ne semble pas prendre le proxy en compte.
Rendre une variable permanente
export dans le shell courant (ou via env VAR=val commande) ne dure que le temps de la session ou de la commande. Pour une variable durable :
- par utilisateur, à chaque nouveau shell : ajouter
export VAR=valeurdans~/.bashrc— voir Bashrc pour la distinction entre fichiers de démarrage interactifs/non-interactifs et login/non-login. - pour tous les utilisateurs et tous les processus (y compris ceux lancés hors d'un shell, comme les services systemd) : ajouter
VAR=valeurdans/etc/environment(une variable par ligne, sansexport, valeur non interprétée par un shell).
⚠️ /etc/environment est lu par PAM au login, pas par bash à chaque sous-shell : un service déjà démarré doit être relancé pour voir la nouvelle valeur, et la syntaxe ne supporte pas l'expansion de variables (PATH=$PATH:/xxx n'y fonctionne pas).
Voir aussi
- Bashrc — fichiers de démarrage du shell, où placer les variables persistantes par utilisateur