Existe uma maneira de chamar um subshell completamente isolado de um script bash? O que quero dizer é que o subshell chamado não terá variáveis herdadas de seu pai. Isto é essencialmente o que estou tentando realizar
Inicia um novo bashintérprete para interpretar your code hereem um ambiente inicialmente vazio.
Como é uma nova bashinstância, não herdaria os aliases, parâmetros posicionais, variáveis não exportadas, funções.
Com o env -itambém não herdaria as variáveis e funções exportadas (definidas pela chamada bashou possivelmente herdadas anteriormente).
Ele ainda herdaria alguns outros tipos de atributos que são preservados na execução de bifurcação e comando, como os umaskdescritores de arquivo abertos sem o sinalizador close-on-exec, limites, algumas disposições de sinal (como um trap '' INTno chamador também faria com que o SIGINT fosse ignorado no chamado).
Observe que, como env -i bashtambém desativa a PATHvariável de ambiente, isso significa que ela só funcionará se bashpuder ser encontrada no caminho de pesquisa padrão da libc. Em sistemas GNU / Linux mais antigos (e não tão antigos), ele procuraria bashprimeiro no diretório atual o que seria potencialmente perigoso.
Stéphane Chazelas
@ StéphaneChazelas Se o PATH estiver definido em um arquivo de inicialização (lido) como em /etc/profile: não há esse problema.
Isaac
@isaac, envnão lê /etc/profile. Esse é o tipo de arquivo lido pelos shells de login. O problema aqui é que env -ilimpe o ambiente e, em seguida, chame execvp("bash", ...)e execvp()procure bashem um PATH padrão que, por exemplo, no Ubuntu 16.04 :/bin:/usr/bin. Se estiver cd /tmp; ln -s /bin/echo bash; env -i bash -c uname, veja -c uname, não Linuxindependentemente do que /etc/profilecontém.
Stéphane Chazelas
@ StéphaneChazelas Obrigado; Atualizei a resposta para ter o caminho completo para o comando que está sendo executado.
Respostas:
Inicia um novo
bash
intérprete para interpretaryour code here
em um ambiente inicialmente vazio.Como é uma nova
bash
instância, não herdaria os aliases, parâmetros posicionais, variáveis não exportadas, funções.Com o
env -i
também não herdaria as variáveis e funções exportadas (definidas pela chamadabash
ou possivelmente herdadas anteriormente).Ele ainda herdaria alguns outros tipos de atributos que são preservados na execução de bifurcação e comando, como os
umask
descritores de arquivo abertos sem o sinalizador close-on-exec, limites, algumas disposições de sinal (como umtrap '' INT
no chamador também faria com que o SIGINT fosse ignorado no chamado).fonte
O
env
comando com o-i
sinalizador cria um ambiente vazioAgora
bash
criará um conjunto de variáveis, mas elas não serão herdadas; isso é apenasbash
serbash
Conchas diferentes criarão variáveis diferentes; por exemplo, ksh93 e csh:
fonte
env -i bash
também desativa aPATH
variável de ambiente, isso significa que ela só funcionará sebash
puder ser encontrada no caminho de pesquisa padrão da libc. Em sistemas GNU / Linux mais antigos (e não tão antigos), ele procurariabash
primeiro no diretório atual o que seria potencialmente perigoso./etc/profile
: não há esse problema.env
não lê/etc/profile
. Esse é o tipo de arquivo lido pelos shells de login. O problema aqui é queenv -i
limpe o ambiente e, em seguida, chameexecvp("bash", ...)
eexecvp()
procurebash
em um PATH padrão que, por exemplo, no Ubuntu 16.04:/bin:/usr/bin
. Se estivercd /tmp; ln -s /bin/echo bash; env -i bash -c uname
, veja-c uname
, nãoLinux
independentemente do que/etc/profile
contém.