Je veux exécuter un programme dans un environnement vide (c'est-à-dire sans définir de variables envariables). Comment faire cela en bash?
Je veux exécuter un programme dans un environnement vide (c'est-à-dire sans définir de variables envariables). Comment faire cela en bash?
Réponses:
Vous pouvez le faire avec env
:
env -i your_command
Contrairement aux commentaires ci-dessous, cela efface complètement l'environnement, mais n'empêche pas la your_command
définition de nouvelles variables. En particulier, l’exécution d’un shell entraînera l’ /etc/profile
exécution de celui-ci, qui peut également comporter certains 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.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
impressions /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
et SHLVL
sont réglées automatiquement par Bash. +1
env -i bash --norc -c "declare -p PATH"
donne declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Notez le "-x" pour l'export (et donc une partie de l'environnement) si vous l'exportez vous-même: env -i bash --norc -c "export PATH; declare -p PATH"
donnedeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Un bash
environnement "propre" peut être créé avec
$ env -i bash --noprofile --norc
La 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é.
L' --noprofile
option empêche la bash
lecture des scripts d'initialisation de shell personnels ou à l'échelle du système qui seraient autrement lus pour un shell de connexion.
L' --norc
option empêche la bash
lecture des scripts d'initialisation de shell personnels qui seraient autrement lus pour un shell interactif.
env -i
? Vous êtes sur quel système?
env
nettoyer mon environnement, --noprofile
éviter d’approvisionner / etc / profile et mes amis, et --norc
éviter d’approvisionner ~ / .bashrc et mes amis.
env -i somecommand
exécute une commande dans un environnement vide, comme l' a déjà mentionné ams .
Beaucoup de programmes reposent sur des variables d'environnement importantes. Vous souhaiterez donc peut-être 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
env
ne supporte pas la --
délimitation et les env -i FOO=bar -- env
tentatives d'exécution d'une commande nommée --
.
env -i -- FOO=bar env
, en fait. Ma faute. Non pas que le --
soit utile puisque ce qui suit ne commence pas par -
.
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 que vous obtiendriez si vous vous connectiez en mode non interactif). Cela permet par exemple de définir la langue, le fuseau horaire, HOME, etc.
env -i
effacé HOME
, ce qui signifie que bash -l
vous ne pouvez pas trouver votre .bash_profile
etc. Si vous voulez un shell qui ressemble à ce que vous obtiendrez lors d’une nouvelle connexion, vous avez besoin d’un indirection supplémentaire à définir en HOME
premier.
Le problème avec la plupart des réponses ici, c’est que ça env -i
efface HOME
, donc même si vous courez bash -l
à l’intérieur, il ne lira pas votre .bash_profile
etc. Si vous recherchez un shell qui agit comme si vous veniez de vous connecter, Voudrais ceci à la place:
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
bash
shell de connexion sera exécuté .bash_login
ou .bash_profile
. Pour obtenir un environnement propre, utilisez --noprofile
ou définissez HOME
un répertoire ne contenant pas ces fichiers. Je suppose que cela dépend de ce que vous entendez par «propre».
env -i bash -c ...
. Cette réponse concerne spécifiquement le shell qui ressemble à une nouvelle connexion sur la machine.
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."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
alors j'obtiens ceci:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.