A execução de "exec echo some; echo test" no bash nunca imprime "some test"?

A execução de "exec echo some; echo test" no bash nunca imprime "some test"?

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 execcomando 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

  1. o shell executa o programa exec, que
  2. 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 exectiver 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 execfailopçã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 execfalha.

Responder2

O execbuiltin (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 echono PATH, e esse executável fosse impresso some textem vez de some. Isso não pode acontecer em circunstâncias normais, onde o echoexecutável se comporta como seria de esperar de um comando chamado echo.

Se não houver nenhum arquivo executável chamado echono PATH ou a execução falhar, execserá 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

execsempre 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).

execpode 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. bashsai 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"

informação relacionada