O que é o ambiente de execução onde 'comando [argumentos]' no 'comando exec [argumentos]' é executado?

0

Do manual do bash

exec

exec [-cl] [-a name] [command [arguments]]

If command is supplied, it replaces the shell without creating a new process. If the -l option is supplied, the shell places a dash at the beginning of the zeroth argument passed to command. This is what the login program does. The -c option causes command to be executed with an empty environment.

Sem a opção -c , qual é o ambiente de execução em que command [arguments] é executado?

  • É o mesmo que o ambiente de execução no processo original do shell antes de executar exec command [arguments] ?

  • O ambiente de execução no processo de shell original contém não apenas variáveis de ambiente, mas também todas as variáveis de shell, incluindo aquelas que não são de ambiente. O ambiente de execução em que command in exec command é executado também inclui as variáveis que não são de ambiente no processo de shell original?

Você pode dar alguns exemplos para mostrar isso?

    
por Tim 10.12.2016 / 16:18

1 resposta

3

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.

    
por 10.12.2016 / 16:51

Tags