Sobes.tech
Middle

Qual é a diferença entre exec e shell?

sobes.tech IA

Resposta da IA

O exec é executado diretamente, substituindo o processo atual por um novo. O shell, por outro lado, é iniciado como um processo filho, interpretando os comandos. O exec é mais rápido e seguro, pois não requer um interpretador intermédio, mas não suporta redirecionamento de saída, pipes e variáveis de ambiente definidas no script. O shell oferece essas funcionalidades, mas adiciona custos adicionais na execução do interpretador.

Exemplo de uso em Dockerfile:

# Uso de exec
CMD ["nginx", "-g", "daemon off;"]

# Uso de shell
CMD nginx -g "daemon off;"

No primeiro caso (exec), o Docker executa nginx diretamente. No segundo (shell), o Docker inicia /bin/sh -c nginx -g "daemon off;".

Principais diferenças:

  • Processo: O exec substitui o processo atual, o shell é executado como um processo filho.
  • Desempenho: O exec é mais rápido.
  • Funcionalidades: O shell suporta pipes, redirecionamentos, variáveis de ambiente do script. O exec não.
  • Segurança: O exec é mais seguro, pois não passa pelo interpretador de comandos.
  • Sinais: No modo exec, os sinais (por exemplo, SIGTERM) são enviados diretamente ao processo. No modo shell, eles são enviados ao shell, que pode redirecioná-los. Isso pode causar problemas ao finalizar corretamente a aplicação.

Tabela comparativa:

Característica Exec Shell
Tipo de execução Substitui o processo atual Processo filho
Velocidade Mais rápido Mais lento
Pipes/Redirecionamentos Não Sim
Sinais Diretamente ao processo Através do shell
Variáveis do script Não disponíveis Disponíveis
Propósito Executar a aplicação principal Executar comandos complexos