Voglio eseguire un programma in un ambiente vuoto (cioè senza set di invariabili). Come farlo in bash?
Voglio eseguire un programma in un ambiente vuoto (cioè senza set di invariabili). Come farlo in bash?
Risposte:
Puoi farlo con env
:
env -i your_command
Contrariamente a commenti qui sotto, questo non del tutto chiaro l'ambiente, ma non impedisce your_command
l'impostazione nuove variabili. In particolare, l'esecuzione di una shell provocherà l' /etc/profile
esecuzione, e la shell potrebbe avere anche alcune impostazioni integrate.
Puoi verificarlo con:
env -i env
cioè pulire l'ambiente e quindi stamparlo. L'output sarà vuoto.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
stampe /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
e SHLVL
vengono impostati automaticamente da Bash. +1.
env -i bash --norc -c "declare -p PATH"
dà declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Nota la "-x" per esportato (e quindi parte dell'ambiente) se lo esporti tu stesso: env -i bash --norc -c "export PATH; declare -p PATH"
dàdeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Si bash
può avere un ambiente "pulito"
$ env -i bash --noprofile --norc
Il env -i
comando esegue il comando assegnatogli dalla riga di comando senza trasferire nessuna delle variabili di ambiente esportate del vecchio ambiente di shell nell'ambiente del programma eseguito.
L' --noprofile
opzione impedisce bash
di leggere gli script di inizializzazione della shell personali o di sistema che altrimenti verrebbero letti per una shell di accesso.
L' --norc
opzione interrompe la bash
lettura degli script di inizializzazione della shell personale che altrimenti verrebbero letti per una shell interattiva.
env -i
? Su quale sistema sei?
env
per pulire il mio ambiente e --noprofile
per evitare l'approvvigionamento / etc / profilo e gli amici e --norc
per evitare l'approvvigionamento ~ / .bashrc e gli amici.
env -i somecommand
esegue un comando in un ambiente vuoto, come già indicato da ams .
Molti programmi si basano su alcune importanti variabili di ambiente, quindi potresti volerle conservare:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
In alternativa, è possibile accedere a un piccolo ambiente di accesso-tempo.
ssh localhost somecommand
env
non supporta la --
delimitazione e fa env -i FOO=bar -- env
tentativi di eseguire un comando chiamato --
.
env -i -- FOO=bar env
, in realtà. Colpa mia. Non che --
sia utile poiché ciò che segue non inizia con -
.
Mentre la risposta accettata è corretta, quello che di solito vuoi fare è:
env -i bash -l -c "printenv; and any other commands"
Questo ti dà bash nudo ma funzionale (lo stesso che avresti quando accedi in modalità non interattiva). Questo, ad esempio, imposta lingua, fuso orario, HOME, ecc.
env -i
cancella HOME
, il che significa che bash -l
non riesci a trovare il tuo .bash_profile
ecc. Se vuoi una shell che è come quella che avresti con un nuovo login, devi HOME
prima impostare una indiretta extra .
Il problema con la maggior parte delle risposte qui è che si env -i
risolve HOME
, quindi anche se corri bash -l
all'interno, non leggerà il tuo .bash_profile
ecc. Se quello che stai cercando è una shell che si comporta come se avessi appena effettuato un nuovo login, tu Vorrei questo invece:
env -i HOME="$HOME" bash -l -c 'your_command'
Esempio:
$ 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
verrà eseguita una shell di accesso .bash_login
o .bash_profile
. Per ottenere un ambiente pulito, utilizzare --noprofile
o impostare HOME
su una directory che non ha quei file. Suppongo che dipenda da cosa intendi per "pulito".
env -i bash -c ...
. Questa risposta è specifica quando vuoi una shell che sembra aver appena effettuato un nuovo login sul computer.
Per rispondere al commento di Balki (e rispondere alla mia domanda nel processo :-):
% 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
ottengo questo:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.