Eu quero executar um programa em um ambiente vazio (ou seja, sem ambientes configuráveis). Como fazer isso no bash?
Eu quero executar um programa em um ambiente vazio (ou seja, sem ambientes configuráveis). Como fazer isso no bash?
Respostas:
Você pode fazer isso com env
:
env -i your_command
Ao contrário dos comentários abaixo, isso faz completamente claro o ambiente, mas não impede your_command
a criação de novas variáveis. Em particular, a execução de um shell fará com /etc/profile
que ele seja executado, e o shell também poderá ter algumas configurações internas.
Você pode verificar isso com:
env -i env
ou seja, limpe o ambiente e imprima-o. A saída ficará em branco.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
imprime /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
e SHLVL
são definidos automaticamente pelo 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:."
. Observe o "-x" para exportar (e, portanto, parte do ambiente) se você exportá-lo a si mesmo: 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:."
Um bash
ambiente "limpo" pode ser obtido com
$ env -i bash --noprofile --norc
O env -i
comando executa o comando fornecido na linha de comando sem transferir nenhuma das variáveis de ambiente exportadas do antigo ambiente de shell para o ambiente do programa executado.
A --noprofile
opção para bash
de ler os scripts de inicialização do shell pessoais ou de todo o sistema que, de outra forma, seriam lidos para um shell de login.
A --norc
opção para bash
de ler os scripts de inicialização do shell pessoal que, de outra forma, seriam lidos para um shell interativo.
env -i
? Em que sistema você está?
env
para limpar meu ambiente e --noprofile
evitar o fornecimento de / etc / profile e amigos, e --norc
evitar o fornecimento de ~ / .bashrc e amigos.
env -i somecommand
executa um comando em um ambiente vazio, como ams já mencionou .
Muitos programas contam com algumas variáveis de ambiente importantes, portanto, você pode mantê-las:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Como alternativa, você pode fazer login em um pequeno ambiente de tempo de login.
ssh localhost somecommand
env
não suporta --
delimitação e env -i FOO=bar -- env
tenta executar um comando chamado --
.
env -i -- FOO=bar env
, na verdade. Minha culpa. Não que isso --
seja útil, pois o que segue não começa -
.
Enquanto a resposta aceita estiver correta, o que você normalmente quer fazer é:
env -i bash -l -c "printenv; and any other commands"
Isso fornece um bash simples, mas funcional (o mesmo que você obteria ao fazer login no modo não interativo). Por exemplo, define o idioma, o fuso horário, HOME, etc.
env -i
limpa HOME
, o que significa que bash -l
não é possível encontrar o seu .bash_profile
etc. Se você deseja um shell parecido com o que você obteria em um novo login, você precisa de um indireto extra para definir HOME
primeiro.
O problema com a maioria das respostas aqui é que isso env -i
desaparece HOME
; portanto, mesmo que você execute bash -l
por dentro, ele não lerá o seu .bash_profile
etc. Se o que você procura é um shell que age como se tivesse acabado de fazer um novo login, você gostaria disso:
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
bash
shell de login será executado .bash_login
ou .bash_profile
. Para obter um ambiente limpo, use --noprofile
ou defina HOME
um diretório que não possua esses arquivos. Suponho que depende do que você quer dizer com "limpo".
env -i bash -c ...
. Essa resposta é específica quando você deseja um shell que parece ter acabado de fazer um novo login na máquina.
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."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
, recebo o seguinte:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.