Je veux exécuter un programme dans un environnement vide (c'est-à-dire sans aucun paramètre envariables). Comment faire ça en bash?
Vous pouvez le faire avec env
:
env -i your_command
Contrairement aux commentaires ci-dessous, cela ne efface complètement l'environnement, mais cela n'empêche pas your_command
définition de nouvelles variables. En particulier, l'exécution d'un shell provoquera le /etc/profile
pour s'exécuter, et le Shell peut également avoir des paramètres intégrés.
Vous pouvez vérifier cela avec:
env -i env
c'est-à-dire essuyez l'environnement puis imprimez-le. La sortie sera vide.
Un environnement "propre" bash
peut être créé avec
$ env -i bash --noprofile --norc
Le env -i
commande exécute la commande qui lui est donnée sur la ligne de commande sans transférer aucune des variables d'environnement exportées de l'ancien environnement Shell vers l'environnement du programme exécuté.
Le --noprofile
l'option empêche bash
de lire les scripts d'initialisation du shell à l'échelle du système ou personnels qui seraient autrement lus pour un shell de connexion.
Le --norc
l'option empêche bash
de lire les scripts d'initialisation du Shell personnels qui seraient autrement lus pour un Shell interactif.
env -i somecommand
exécute une commande dans un environnement vide, comme ams l'a déjà mentionné .
De nombreux programmes dépendent de certaines variables d'environnement importantes, vous pouvez donc les conserver:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Vous pouvez également vous connecter à un petit environnement de connexion.
ssh localhost somecommand
Bien que la réponse acceptée soit correcte, ce que vous voulez généralement faire est de:
env -i bash -l -c "printenv; and any other commands"
Cela vous donne un bash nu mais fonctionnel (identique à celui obtenu lors de la connexion en mode non interactif). Cela définit par exemple la langue, le fuseau horaire, la MAISON, etc.
Le problème avec la plupart des réponses ici est que env -i
efface HOME
, donc même si vous exécutez bash -l
à l'intérieur, il ne lira pas votre .bash_profile
etc. Si ce que vous cherchez est un Shell qui agit comme si vous veniez de faire une nouvelle connexion, vous voudriez plutôt ceci:
env -i HOME="$HOME" bash -l -c 'your_command'
Exemple:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
Pour répondre au commentaire de balki (et répondre à ma propre question dans le processus :-):
% echo Environment in calling Shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling Shell: vars: 43
==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.
#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh
echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
Si vous voulez vous assurer qu'un script a un environnement propre, vous pouvez modifier la ligne Shebang comme ce petit exemple l'illustre:
#!/usr/bin/env -S -i bash
env
qui affiche son environnement comme celui-ci
PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env
Ici, nous exécutons bash
Shell à travers env
qui prend un -i
argument qui lui demande de nettoyer l'environnement. Le -S
est requis lors du passage de plusieurs arguments sur les lignes Shebang .