Bash não está retornando $? variável corretamente

Bash não está retornando $? variável corretamente

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 localbuiltin 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 $?
}

informação relacionada