Bash não está retornando $? variável corretamente quando a saída do comando é atribuída a uma variável local:
test() {
aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 124 (!=0 as expected)
local aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 0
}
Por que?
Responder1
local
é um comando por si só (é um shell embutido), então você está obtendo o valor de retorno de local
, não o valor de retorno do pipeline em sua substituição de comando. Você pode considerar declarar a variável local antes da atribuição, o que evitará ter que chamar o local
builtin durante o mesmo pipeline da substituição do comando, o que evitará obscurecer o código de saída do seu comando:
foo() {
local bar
bar=$(baz)
echo $?
}