Eu vi exemplos de scripts de wrapper que, em poucas palavras, são os seguintes:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
exec "$myprog" "$@"
Como visto acima, eles usam exec
para substituir o shell recém-criado quase imediatamente pelo $myprog
. Pode-se conseguir o mesmo sem exec
:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
"$myprog" "$@"
Neste último exemplo, uma nova instância do bash é iniciada e, em seguida, $myprog
iniciada como um processo filho da instância do bash.
Quais são os benefícios da primeira abordagem?
exec
builtin .Respostas:
O uso
exec
torna o wrapper mais transparente, ou seja, torna menos provável que o usuário ou aplicativo que chama o script precise estar ciente de que é um relé que, por sua vez, inicia o programa "real".Em particular, se o chamador quiser matar o programa, ele simplesmente matará o processo que acabou de lançar. Se o script do wrapper executar um processo filho, o responsável pela chamada precisará saber que eles devem descobrir o filho do wrapper e matá-lo. O script do wrapper pode definir uma armadilha para retransmitir alguns sinais, mas isso não funcionaria com o SIGSTOP ou o SIGKILL, que não pode ser capturado.
A chamada
exec
também economiza um pouco de memória (e outros recursos, como PIDs etc.), uma vez que não há necessidade de manter um shell extra por aí sem nada a fazer.Se houver vários wrappers, os problemas aumentam (dificuldade em encontrar o processo correto para eliminar, sobrecarga de memória etc.).
Alguns shells (por exemplo, o shell Korn) detectam automaticamente quando um comando é o último e não há uma armadilha ativa e colocam um implícito
exec
, mas nem todos o fazem (por exemplo, não o bash).fonte
Não encontrando duplicatas ... consulte o manual do FreeBSD , que fornece uma boa razão:
que é essencialmente a razão que me foi explicada há algum tempo (por um dos carregadores), e é bastante conhecida.
fonte