This Bash snippet works as I would've expected:
$ fun1() { x=$(false); echo "exit code: $?"; }
$ fun1
exit code: 1
But this one, using local
, does not:
$ fun2() { local x=$(false); echo "exit code: $?"; }
$ fun2
exit code: 0
Can anyone explain why does local
sweep the return code of the command?
The reason the code with
local
returns 0 is because$?
"Expands to the exit status of the most recently executed foreground pipeline." Thus$?
is returning the success oflocal
You can fix this behavior by separating the declaration of
x
from the initialization ofx
like so:The return code of the
local
command obscures the return code offalse