¿Por qué “local” barre el código de retorno de un comando?

Este fragmento de Bash funciona como esperaba:

$ fun1() { x=$(false); echo "exit code: $?"; } $ fun1 exit code: 1 

Pero este, usando local , no:

 $ fun2() { local x=$(false); echo "exit code: $?"; } $ fun2 exit code: 0 

¿Alguien puede explicar por qué el local barre el código de retorno del comando?

La razón por la cual el código con retornos local 0 es porque $? “Se expande al estado de salida de la tubería de primer plano ejecutada más recientemente”. Por lo tanto $? está regresando el éxito del local

Puede corregir este comportamiento separando la statement de x de la inicialización de x como así:

 $ fun() { local x; x=$(false); echo "exit code: $?"; }; fun exit code: 1 

El código de retorno del comando local oscurece el código de retorno de false