Você está confundindo duas coisas diferentes: ambiente de execução e variáveis do ambiente .
Variáveis de ambiente são strings de formulário name=value
e são usadas como uma forma de configuração para os comandos e processos. Por exemplo, PATH
é uma lista separada por vírgulas de diretórios nos quais os comandos executáveis são procurados, quando apenas o nome do arquivo do comando é fornecido; LANG
e várias variáveis que começam com LC_
controlam a localidade e assim por diante.
Ambiente de execução inclui todos os recursos do shell que afetam como os comandos podem ser executados. Ele inclui variáveis de ambiente, é claro, mas também coisas como o diretório de trabalho, a máscara de criação de arquivos ( umask
), funções de shell e aliases definidos e assim por diante.
No ponto de execução - o momento em que o shell inicia a execução do comando -, o ambiente de execução é quase exatamente o mesmo em todos os casos, com ou sem exec
. Com exec
, o trap EXIT
do shell é acionado (porque o shell está essencialmente saindo, quando substituído por outro processo). Com exec -c
, as variáveis de ambiente são limpas.
O sinalizador -c
para Bash exec
limpa apenas as variáveis de ambiente. Se você correr
bash -c 'exec env'
você inicia um novo shell Bash, que é então substituído pelo comando env
; que, quando nenhum outro parâmetro é especificado, apenas mostra todas as variáveis de ambiente. No entanto, se você adicionar o -c
flag a exec
, ou seja,
bash -c 'exec -c env'
não imprime nada, e isso porque env
é executado sem variáveis de ambiente (ou, em outras palavras, um ambiente vazio).
(Se você executar apenas exec env
em um terminal, o shell em execução no terminal será substituído pelo comando env
e, quando sair, o terminal será fechado. Provavelmente, isso acontecerá rápido demais para você É por isso que eu explicitamente o executo no Bash, dessa forma, é aquele sub-Bash que é substituído, e não o shell que seu terminal está usando.)
Eu não vi a opção -c
usada em scripts da vida real, como normalmente é usado env -i
. Por exemplo:
bash -c 'exec env -i PATH=$PATH env'
Com parâmetros, o comando env
é usado para executar um comando com variáveis de ambiente modificadas; a opção -i
é usada para começar do zero; isto é, limpe todas as variáveis de ambiente existentes. Como o shell analisa todo o comando (linha) antes de executá-lo, você pode usar env -i VAR=$VAR OTHER=$OTHER
para manter variáveis de ambiente específicas - informando env
para defini-las com os valores antigos que tinham quando o shell analisava a linha de comando. Acima, o% final env
apenas exibe as variáveis de ambiente resultantes, mas pode ser qualquer outro comando.