returngeralmente 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 returncom um valor negativo, $?conterá um número positivo.
Agora, entre as conchas cuja returnaceita 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 -- -123se de outra forma que -123é tomado como três -1, -2, -3opções inválidas.
Como o pdksh e seus derivados (como o OpenBSD shou 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 mkshe 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 executarcmdo 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 quecmdforam mortas quando as possui (a maioria das shells não pode recuperar essas informações de qualquer maneira).