É uma variável de ambiente temporária adicionada antes ou depois que o shell cria um processo filho que executará um comando?

1

No bash, ao correr

myvar=val mycommand myargs

myvar=val será adicionado ao ambiente para executar mycommand .

Suponha que o processo bash chame fork() para criar um processo filho que executará mycommand , ou seja, mycommand é um arquivo executável externo ou um arquivo de script.

Quando a adição de myvar=val ao ambiente acontece, antes ou depois do bash shell chama fork() ? Em outras palavras, qual das duas possibilidades a seguir realmente acontece?

  • o processo bash adiciona myvar=val ao seu próprio ambiente e, em seguida, chama fork() para criar um processo filho que chama execve() para executar mycommand e myvar=val como parte do ambiente de o processo bash é herdado no ambiente do processo filho. Ao concluir a execução de mycommand e a saída do processo filho, o processo bash descarta myvar=val de seu próprio ambiente.

  • o processo bash chama fork() para criar um processo filho que executará mycommand , e o processo filho adiciona myvar=val ao seu próprio ambiente e chama execve() para executar mycommand .

Minha pergunta é motivada pela resposta de Stephen ao meu post anterior .

In Bash, _ is a special parameter which is set to the value of the last argument every time a command is parsed. It also has the special property of not being exportable, which is enforced every time a command is executed (see bind_lastarg in the Bash source code).

Eu estou querendo saber que quando um processo bash executa um comando, se o bash não adiciona _ ao seu próprio ambiente, por que ele precisa descartá-lo de seu próprio ambiente?

Obrigado.

    
por Tim 12.04.2018 / 22:17

1 resposta

4

A realidade está em algum lugar entre as duas possibilidades que você descreve. O Bash não adiciona myvar ao seu próprio ambiente, pelo menos não ao ambiente de shell completo, como geralmente pensamos; adiciona myvar ao seu ambiente temporário . Em seguida, ele cria o ambiente de exportação, especificamente para o novo comando, a partir do ambiente temporário, junto com o contexto da variável atual e as funções do shell, forçando, se necessário, a execução do comando filho. Você pode ver isso como chamadas para maybe_make_export_env no código-fonte do Bash . O ambiente temporário é então limpo depois que a criança é iniciada; procure por dispose_used_env_vars .

Na prática, isso não faz diferença. O comando filho recebe o ambiente que deveria receber, e o ambiente pai também deve estar pronto quando você recuperar o controle. a menos que você faça alterações no Bash, isso é tudo que importa.

    
por 12.04.2018 / 22:37

Tags