Sim, o valor de retorno implícito de uma função é o status de saída do último comando executado . Isso também é verdade em qualquer ponto de qualquer script de shell. Em qualquer ponto da sequência de execução do script, o status de saída atual é o status de saída do último comando executado. Mesmo comando executado como parte de uma atribuição de variável: var=$(exit 34) . A diferença com as funções é que uma função pode alterar o status de saída no final da execução da função.
A maneira alternativa de alterar o "status de saída atual" é iniciar um subconjunto e sair dele com qualquer status de saída necessário:
$ $(exit 34)
$ echo "$?"
34
E sim, o status de saída expansão precisa ser citado:
$ IFS='123'
$ $(exit 34)
$ echo $?
4
Um (exit 34) também funciona.
Alguns podem argumentar que uma construção mais robusta deve ser $(return 34) e que uma saída deve "sair" do script que está sendo executado. Mas $(return 34) não funciona com qualquer versão do bash. Então, não é portátil.
A maneira mais segura de definir um status de saída é usá-lo como foi projetado para funcionar, definir e return de uma função:
exitstatus(){ return "${1:-"$?"}"; }
Então, no final de uma função. é exatamente equivalente a não ter nada ou return ou return "$?" . O final de uma função não precisa significar a "última linha de código de uma função".
#!/bin/sh
exitstatus(){ a="${1:-"$?"}"; return "$a"; }
gmx(){
if [ "$1" = "one" ]; then
printf 'foo ';
exitstatus 78
return "$?"
elif [ "$1" = "two" ]; then
printf 'baz ';
exitstatus 89
return
else
printf 'baz ';
exitstatus 90
fi
}
imprimirá:
$ ./script
foo 78
baz 89
baz 90
O único uso prático para "$?" é imprimir seu valor: echo "$?" ou armazená-lo em uma variável (como é um valor efêmero e mudar com cada comando executado): exitstatus=$? (lembre-se de citar a variável em comandos como export EXITSTATUS="$?" .
No comando return , o intervalo válido de valores é geralmente de 0 a 255, mas entenda que valores de 126 + n são usados por alguns shells para sinalizar status de saída especial, portanto, a recomendação geral é usar 0- 125.