Digamos que eu tenha uma função bash assim:
gmx(){
echo "foo";
}
esta função retornará implicitamente o valor de saída do echo
comando ou o uso de return é necessário?
gmx(){
echo "foo";
return $?
}
Presumo que, da maneira como o bash funciona, o status de saída do comando final da função bash é aquele que é "retornado", mas não é 100% certo.
return
faz um retorno explícito de uma função shell ou "script de ponto" (um script de origem). Sereturn
não for executado, um retorno implícito é feito no final da função shell ou script de ponto.Se
return
for executado sem parâmetro, equivale a retornar o status de saída do último comando executado.É assim que
return
funciona em todos os shells POSIX.Por exemplo,
é, portanto, equivalente a
que é o mesmo que
Em geral, é muito raro que você precise usar
$?
. É realmente necessário apenas se você precisar salvá-lo para uso futuro, por exemplo, se precisar investigar seu valor várias vezes (nesse caso, você atribuiria seu valor a uma variável e executaria uma série de testes nessa variável).Da
bash(1)
página man:Vou apenas adicionar algumas notas de cautela às respostas já fornecidas:
Embora
return
tenha um significado muito especial para o shell, do ponto de vista da sintaxe, é um comando interno do shell e uma instrução de retorno é analisada como qualquer outro comando simples. Então, isso significa que como no argumento de qualquer outro comando,$?
quando sem aspas, estaria sujeito a split+globEntão você precisa citar isso
$?
para evitá-lo:return
geralmente não aceita nenhuma opção (ksh93
s aceita o usual--help
,--man
,--author
... embora). O único argumento esperado (opcional) é o código de retorno. O intervalo de códigos de retorno aceitos varia de shell para shell, e se qualquer valor fora de 0..255 é refletido adequadamente$?
também varia de shell para shell. Consulte Código de saída padrão quando o processo é encerrado? para detalhes sobre isso.A maioria dos shells aceita números negativos (afinal, o argumento passado para a chamada do sistema
_exit()
/exitgroup()
é umint
, portanto, com valores abrangendo pelo menos -2 31 a 2 31 -1, portanto, faz sentido que os shells aceitem o mesmo intervalo para suas funções) .A maioria dos shells usa o
waitpid()
e co. API para recuperar esse status de saída; no entanto, nesse caso, é truncado para um número entre 0 e 255 quando armazenado em$?
. Embora invocar uma função não envolva gerar um processo e seja usadowaitpid()
para recuperar seu status de saída, já que tudo é feito no mesmo processo, muitos shells também imitam essewaitpid()
comportamento ao invocar funções. O que significa que mesmo se você ligarreturn
com um valor negativo,$?
conterá um número positivo.Agora, entre os shells que
return
aceitam números negativos (ksh88, ksh93, bash, zsh, pdksh e derivados diferentes de mksh, yash), existem alguns (pdksh e yash) que precisam ser escritos comoreturn -- -123
caso contrário,-123
são considerados três-1
,-2
,-3
opções inválidas.Como pdksh e seus derivados (como OpenBSD
sh
ouposh
) preservam o número negativo em$?
, isso significa que fazerreturn "$?"
falharia quando$?
contivesse um número negativo (o que aconteceria quando o último comando de execução fosse uma função que retornasse um número negativo).Então
return -- "$?"
seria melhor nessas conchas. No entanto, observe que, embora suportada pela maioria dos shells, essa sintaxe não é POSIX e, na prática, não é suportada pormksh
derivados do ash.Portanto, para resumir, com shells baseados em pdksh, você pode usar números negativos em argumentos para funções, mas se o fizer,
return "$@"
não funcionará. Em outros shells,return "$@"
funcionará e você deve evitar usar números negativos (ou números fora de 0..255) como argumentos parareturn
.Em todos os shells que conheço, chamar
return
de dentro de um subshell em execução dentro de uma função fará com que o subshell saia (com o status de saída fornecido, se houver, ou o do último comando executado), mas não causará um retorno da função ( para mim, não está claro se o POSIX oferece essa garantia, alguns argumentam queexit
deve ser usado para sair de subshells dentro de funções). Por exemploirá produzir: