Come eseguire un programma in un ambiente pulito in bash?


Risposte:


127

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.


4
Non cancella completamente l'ambiente: le 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.
l0b0

2
Tuttavia, sembra che questo è il più vicino si può ottenere - Sembra che variabili come PATH, PWDe SHLVLvengono impostati automaticamente da Bash. +1.
l0b0

3
@ I0b0: vedi la mia modifica.
ams

3
La variabile PATH nello script del primo commentatore non si trova nell'ambiente e quindi non è una variabile di ambiente. Apparentemente Bash imposta la propria variabile di shell regolare chiamata PATH se non ne esiste una esportata: env -i bash --norc -c "declare -p PATH"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"declare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Binary Phile il

34

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.


Il mio env non riconosce queste opzioni.
Paulo Carvalho,

@PauloCarvalho Il tuo sistema non supporta env -i? Su quale sistema sei?
Kusalananda

Siamo spiacenti, funziona nella shell. Ho provato a inserirlo in una sceneggiatura e in qualche modo ha generato un errore.
Paulo Carvalho,

@PauloCarvalho Spiacente, non riesco a vedere quale comando hai digitato o quale sia stato l'errore.
Kusalananda

Fantastico, proprio quello che stavo cercando. envper pulire il mio ambiente e --noprofileper evitare l'approvvigionamento / etc / profilo e gli amici e --norcper evitare l'approvvigionamento ~ / .bashrc e gli amici.
Felipe Alvarez,

28

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

1
Funziona quando si esegue il comando su cmdline. Come lo inserisco in shebang ?, non sembra funzionare !
balki,

Strano, il mio envnon supporta la --delimitazione e fa env -i FOO=bar -- envtentativi di eseguire un comando chiamato --.
antak,

@antak Questo dovrebbe essere env -i -- FOO=bar env, in realtà. Colpa mia. Non che --sia utile poiché ciò che segue non inizia con -.
Gilles,

Non mi ero reso conto che potevi sempre usare ssh in localhost, è un po 'strano. Qual è il caso d'uso lì.
Edgar Aroutiounian,

@EdgarAroutiounian È possibile SSH per localhost se è in esecuzione un server SSH. Perché i programmatori dovrebbero affrontare lo sforzo di vietarlo?
Gilles,

4

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.


Non funziona abbastanza perché 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 .
Elliott Slaughter,


1

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

1
Si noti che 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".
Kusalananda

1
Sì, se vuoi una shell senza letteralmente nulla, segui la risposta originale e fallo env -i bash -c .... Questa risposta è specifica quando vuoi una shell che sembra aver appena effettuato un nuovo login sul computer.
Elliott Slaughter,

0

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

Quando provo questo nella mia linea shebang in CentOS 7.6, ricevo questo errore da env:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

Se cambio lo script per usare l'argomento lungo, --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.
ScottJ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.