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.