Como executar um programa em um ambiente limpo no bash?

89

Eu quero executar um programa em um ambiente vazio (ou seja, sem conjuntos de variáveis). Como fazer isso em bash?

    
por Eugene Yarmash 24.09.2012 / 15:26

6 respostas

102

Você pode fazer isso com env :

env -i your_command

Ao contrário dos comentários abaixo, isso faz limpar completamente o ambiente, mas isso não impede que your_command definam novas variáveis. Em particular, executar um shell fará com que o /etc/profile seja executado, e o shell também pode ter algumas configurações internas.

Você pode verificar isso com:

env -i env

i.e. Limpe o ambiente e imprima-o. A saída ficará em branco.

    
por 24.09.2012 / 15:35
25

env -i somecommand executa um comando em um ambiente vazio, como ams já mencionou .

Muitos programas dependem de algumas variáveis de ambiente importantes, então você pode querer mantê-los:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

Como alternativa, você pode fazer login em um ambiente de tempo de login pequeno.

ssh localhost somecommand
    
por 25.09.2012 / 02:31
22

Um ambiente "limpo" bash pode ser usado com

$ env -i bash --noprofile --norc
  • O comando env -i executa o comando dado a ele na linha de comando sem transferir nenhuma das variáveis de ambiente exportadas do ambiente shell antigo para o ambiente do programa executado.

  • A opção --noprofile impede que bash leiam os scripts de inicialização de todo o sistema ou de shell pessoal que, de outra forma, seriam lidos para um shell de login.

  • A opção --norc impede que bash leia os scripts de inicialização de shell pessoal que, de outra forma, seriam lidos para um shell interativo.

por 24.06.2016 / 19:28
4

Enquanto a resposta aceita está correta, o que você geralmente quer fazer é:

env -i bash -l -c "printenv; and any other commands"

Isso lhe dá um bash nu, mas funcional (o mesmo que você faria quando login no modo não interativo). Isso, por exemplo, define o idioma, o fuso horário, o HOME, etc.

    
por 24.06.2016 / 19:05
1

O problema com a maioria das respostas aqui é que env -i limpa HOME , então mesmo que você execute bash -l por dentro, não lerá seu .bash_profile etc. Se o que você está procurando é um shell que funciona como se você tivesse acabado de fazer um novo login, você quer isso:

env -i HOME="$HOME" bash -l -c 'your_command'

Exemplo:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
    
por 22.06.2018 / 22:31
0

Para responder ao comentário de balki (e responder minha própria pergunta no 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."
    
por 16.05.2014 / 21:01