web-dev-qa-db-fra.com

Comment exécuter un programme dans un environnement propre en bash?

Je veux exécuter un programme dans un environnement vide (c'est-à-dire sans aucun paramètre envariables). Comment faire ça en bash?

121
Eugene Yarmash

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.

135
ams

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.

41
Kusalananda

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.

4
Marcin Raczkowski

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
1
Elliott Slaughter

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."
0
Coroos

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 .

0
starfry