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 na sua substituição de comando. Você pode considerar declarar a variável local antes da atribuição, o que evitará a necessidade de chamar o local
construído durante o mesmo pipeline que a substituição do comando, o que evitará obscurecer o código de saída do seu comando:
foo() {
local bar
bar=$(baz)
echo $?
}