A execução exec echo "some "; echo "test"
no bash nunca imprime "algum teste"?
Gostaria de buscar a confirmação para esta pergunta, pois estou escrevendo um pequeno script de shell e gostaria que ele não continuasse nada 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 shell, quando executados pelo shell, farão
- o shell executa o programa
exec
, que - usa a
exec***
família de chamadas de sistema que substituem o shell/bash que está executando o script, por issoimpedindooutras 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 ocorra após o exec (como echo test
) ser executado.
Eu apreciaria uma resposta geral (POSIX), na medida do possível, mas apenas no caso de particularidades estou mais interessado em GNU/Linux e GNU/Bash
Responder1
Certo, se exec
tiver sucesso, ele substitui o shell atual, então os comandos a seguir não são, err.. executados.
No entanto,pelo menos no Bash, o shell também sai se oexec
falhar:
exec [-cl] [-a name] [command [arguments]]
Secomandoé fornecido, ele substitui o shell sem criar um novo processo. [...] Secomandonão puder ser executado por algum motivo, um shell não interativo será encerrado, a menos que a
execfail
opção shell esteja habilitada. Nesse caso, ele retorna falha.
Portanto, mesmo algo como bash -c 'exec /bin/nosuchfile; echo foo'
imprimirá uma mensagem de erro sobre o arquivo de programa ausente. Para lidar com o erro no script, você precisaria de algo como
#!/bin/bash
shopt -s execfail
exec /someprogram
echo whoops, it failed
Mas você ainda recebe a mensagem de erro do exec
. Se você colocar um redirecionamento no exec
,permanece em vigorse o script continuar após a exec
falha.
Responder2
O exec
builtin (com um argumento de comando¹) substitui o processo shell². Nenhum código subsequente no processo shell é executado.
Portanto, a única maneira exec echo "some "; echo "test"
de imprimir some text
é se houvesse um comando executável chamado echo
no PATH, e esse executável fosse impresso some text
em vez de some
. Isso não pode acontecer em circunstâncias normais, onde o echo
executável se comporta como seria de esperar de um comando chamado echo
.
Se não houver nenhum arquivo executável chamado echo
no PATH ou 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 fera 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
Responder3
exec
sempre termina o scriptseele executa um comando e o faz com sucesso (não relacionado ao código de saída do comando, mas ao seu início).
exec
pode ser executado sem um comando de uma forma muito útil: Para redirecionar permanentemente os descritores de arquivo:
exec 3>/path/to/file
Se o comando não puder ser iniciado, o comportamento do shell dependerá da configuração. bash
sai por padrão.
Pode ser melhor usar uma função:
safe_exec () {
cmd="$1"
if test -z "$cmd" || ! test -f "$cmd" || ! test -x "$cmd"; then
exit 1
else
exec "$@"
fi
}
safe_exec echo "some "; echo "test"