Env

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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=valeur dans ~/.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=valeur dans /etc/environment (une variable par ligne, sans export, 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