env -i
executa o comando especificado com um ambiente vazio.
bash -c …
executa o argumento da opção -c
(o …
) como um trecho de código bash.
bash -c 'echo $SHELL $HOME $USER'
é equivalente a echo $SHELL $HOME $USER
, porque executar o bash não modifica essas variáveis (pelo menos enquanto elas forem definidas inicialmente).
env -i bash -c 'echo $SHELL $HOME $USER'
corre bash
com os argumentos -c
e echo $SHELL $HOME $USER
e com um ambiente vazio. Quando o bash inicia, ele define algumas variáveis do shell, incluindo SHELL
(que é definido apenas como uma variável do shell, não exportado no ambiente de qualquer programa filho que o bash possa iniciar). Assim, quando bash analisa e expande o comando echo $SHELL $HOME $USER
, as variáveis HOME
e USER
não são definidas, mas SHELL
é definido como /bin/sh
(não sei por que bash faz isso), e esse comando exibe /bin/sh
seguido por dois espaços.
As aspas simples em torno do argumento bash -c
garantem que o texto dentro das aspas não seja expandido pelo shell do qual você executa env -i bash -c '…'
, de modo que o texto seja passado como está para o subprocesso bash.