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_commandl'impostazione nuove variabili. In particolare, l'esecuzione di una shell provocherà l' /etc/profileesecuzione, 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.shstampe /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
PATH, PWDe SHLVLvengono 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 bashpuò avere un ambiente "pulito"
$ env -i bash --noprofile --norc
Il env -icomando 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' --noprofileopzione impedisce bashdi leggere gli script di inizializzazione della shell personali o di sistema che altrimenti verrebbero letti per una shell di accesso.
L' --norcopzione interrompe la bashlettura degli script di inizializzazione della shell personale che altrimenti verrebbero letti per una shell interattiva.
env -i? Su quale sistema sei?
envper pulire il mio ambiente e --noprofileper evitare l'approvvigionamento / etc / profilo e gli amici e --norcper evitare l'approvvigionamento ~ / .bashrc e gli amici.
env -i somecommandesegue 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
envnon supporta la --delimitazione e fa env -i FOO=bar -- envtentativi 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 -icancella HOME, il che significa che bash -lnon riesci a trovare il tuo .bash_profileecc. Se vuoi una shell che è come quella che avresti con un nuovo login, devi HOMEprima impostare una indiretta extra .
Il problema con la maggior parte delle risposte qui è che si env -irisolve HOME, quindi anche se corri bash -lall'interno, non leggerà il tuo .bash_profileecc. 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
bashverrà eseguita una shell di accesso .bash_logino .bash_profile. Per ottenere un ambiente pulito, utilizzare --noprofileo impostare HOMEsu 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-environmentottengo questo:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.