Eu quero executar um programa em um ambiente vazio (ou seja, sem ambientes configuráveis). Como fazer isso no bash?
bash
environment-variables
Eugene Yarmash
fonte
fonte
Respostas:
Você pode fazer isso com
env
: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:
ou seja, limpe o ambiente e imprima-o. A saída ficará em branco.
fonte
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
eSHLVL
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 comO
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 parabash
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 parabash
de ler os scripts de inicialização do shell pessoal que, de outra forma, seriam lidos para um shell interativo.fonte
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:
Como alternativa, você pode fazer login em um pequeno ambiente de tempo de login.
fonte
env
não suporta--
delimitação eenv -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.
fonte
env -i
limpaHOME
, o que significa quebash -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 definirHOME
primeiro.O problema com a maioria das respostas aqui é que isso
env -i
desapareceHOME
; portanto, mesmo que você executebash -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:Exemplo:
fonte
bash
shell de login será executado.bash_login
ou.bash_profile
. Para obter um ambiente limpo, use--noprofile
ou definaHOME
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 :-):
fonte
/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.