return
geralmente não aceita qualquer opção ( ksh93
's aceita o habitual --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 corretamente $?
também varia de shell para shell. Consulte Código de saída padrão quando o processo for finalizado? para detalhes sobre isso.
A maioria das shells aceita números negativos (afinal, o argumento passado para a chamada _exit()
/ exitgroup()
system é um int
, portanto, com valores que abrangem pelo menos -2 31 a 2 31 -1, portanto, faz sentido que shells aceitem o mesmo intervalo para suas funções) .
A maioria das conchas 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 armazenada em $?
. Mesmo que invocar uma função não envolva a geração de um processo e usado waitpid()
para recuperar seu status de saída, pois tudo é feito no mesmo processo, muitos shells também imitam esse waitpid()
comportamento ao invocar funções. O que significa que, mesmo se você ligar return
com um valor negativo, $?
conterá um número positivo.
Agora, entre as conchas cuja return
aceita números negativos (ksh88, ksh93, bash, zsh, pdksh e outros que mksh derivados, Yash), existem alguns (pdksh e yash), que precisa dele escrito como return -- -123
se de outra forma que -123
é tomado como três -1
, -2
, -3
opções inválidas.
Como o pdksh e seus derivados (como o OpenBSD sh
ou posh
) preservam o número negativo $?
, isso significa que a execução return "$?"
falharia quando $?
contém 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 suportado pela maioria dos shells, essa sintaxe não é POSIX e, na prática, não é suportada por mksh
e derivados de 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 para return
.
return
é que, para funções definidas comof() (...; cmd; return)
, isso impede a otimização que alguns shells fazem de executarcmd
o mesmo processo que o subshell. Com muitas shells, isso também significa que o status de saída da função não carrega as informações quecmd
foram mortas quando as possui (a maioria das shells não pode recuperar essas informações de qualquer maneira).