o retorno embutido

3

De acordo com o Grupo aberto ,

[t]he return utility shall cause the shell to stop executing the current function or dot script. If the shell is not currently executing a function or dot script, the results are unspecified.

No entanto, se você executar o snippet a seguir

func () {
    ( return 1 )
    return 0
}
func
echo $?

a saída é 0 (tentei bash e dash, com o mesmo resultado). Portanto, parece que return não faz com que o shell pare de executar a função atual, o que contradiz o padrão POSIX. Estou faltando alguma coisa?

    
por Ernest A C 30.09.2012 / 15:48

1 resposta

7
( return 1 )

Isso é executado em um subnível. Ele termina a sub-shell imediatamente e, se você pegar o código de retorno do shell, ele será 1 . A própria função retorna 0 na linha depois disso.

(Consulte Comandos de agrupamento na especificação da linguagem de comandos da Shell.)

Compare com o formulário {} que não introduz um subshell:

#! /bin/sh

func () {
    ( return 42 )
    echo "One:   $?"
    { return 1; }
    echo "Two:   $?"
    return 2
}

func
echo "Three: $?"

Saída (observe a ausência de "Dois"):

One:   42
Three: 1
    
por 30.09.2012 / 15:52