A execução exec echo "some "; echo "test"
no bash nunca imprime "algum teste"?
Gostaria de obter confirmação para esta pergunta, pois estou escrevendo um pequeno script de shell e gostaria que nada continuasse depois que o exec
comando fosse chamado.
Acho que não precisaria me preocupar, conforme meu entendimento, após consultar:
man 3 exec
man 1p exec
Os scripts de shell, quando executados pelo shell, farão
- o shell executa o programa
exec
, que - usa as
exec***
chamadas de sistema da família que substituem o shell/bash que está executando o script, impedindo assim outras ações do shell (que foi "substituído")
Conforme exposto anteriormente, o objetivo principal desta questão é buscar a confirmação do meu raciocínio para evitar que qualquer coisa no script que ocorra após o exec (como echo test
) seja executada.
Agradeceria uma resposta geral (POSIX), na medida do possível, mas apenas em caso de particularidades, estou mais interessado em GNU/Linux e GNU/Bash
Certo, se
exec
for bem sucedido, ele substitui o shell atual, então os seguintes comandos não são, err.. executados.No entanto, pelo menos em Bash , o shell também sai se o
exec
falhar :Portanto, mesmo algo como
bash -c 'exec /bin/nosuchfile; echo foo'
apenas imprimirá uma mensagem de erro sobre o arquivo de programa ausente. Para lidar com o erro no script, você precisaria de algo comoMas, você ainda recebe a mensagem de erro de
exec
. Se você colocar um redirecionamento noexec
, ele permanecerá em vigor se o script continuar após aexec
falha.O
exec
builtin (com um argumento de comando¹) substitui o processo shell². Nenhum código subseqüente no processo shell é executado.Portanto, a única maneira
exec echo "some "; echo "test"
de imprimirsome text
é se houver um comando executável chamadoecho
no PATH e esse executável for impressosome text
em vez desome
. Isso não pode acontecer em circunstâncias normais em que oecho
executável se comporta como seria de esperar de um comando chamadoecho
.Se não houver nenhum arquivo executável chamado
echo
no PATH ou se a execução falhar,exec
será exibida uma mensagem de erro e sairá do shell. Mesmo nesse caso,echo "test"
não é executado.¹ sem um argumento de comando é uma besta diferente. Ele não substitui o processo shell, apenas aplica redirecionamentos. ² Em um subshell, apenas o subshell é afetado, o shell pai continua funcionando normalmente.
exec
exec
sempre termina o script se executar um comando e o faz com sucesso (não relacionado ao código de saída do comando, mas ao iniciá-lo).exec
pode ser executado sem um comando de uma maneira muito útil: Para redirecionar permanentemente os descritores de arquivo:Se o comando não puder ser iniciado, o comportamento do shell dependerá da configuração.
bash
sai por padrão.Pode ser melhor para você usar uma função em vez disso: