为什么“本地”扫描命令的返回码?

这个Bash片段正如我所料:

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

但是,这个使用local不是:

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

任何人都可以解释此行为?

local代码返回0的原因是因为$? “扩展到最近执行的前台pipe道的退出状态。” 那么$? 正在回归local的成功

你可以通过从x的初始化中分离x的声明来解决这个问题,就像这样:

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

local命令的返回码隐藏返回码为false