exit
dentro de uma função sai do script inteiro e não apenas da função (apesar de subshell). Para expor:
#!/bin/bash
f() {
exit 3
}
f
exit 0
O script acima terminará com o código de saída 3, enquanto
#!/bin/bash
f() {
exit 3
}
(f)
exit 0
terminará com o código de saída 0.
A sintaxe $(command)
que você está usando executa command
dentro de uma subshell, e exit
só pode ir além da camada em que a subshell está em execução .
Se você deseja capturar o código de saída e a saída de algo executado em um subshell, isso ainda está disponível para o ambiente no qual a subshell é iniciada:
#!/bin/bash
subshelloutput="$( echo "output"; exit 3 )"
returnval=$? # captures subshell's exit code
: more stuff follows