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

tok*_*and 56 bash shell local

这个Bash片段的工作原理与我预期的一样:

$ fun1() { x=$(false); echo "exit code: $?"; }
$ fun1
exit code: 1
Run Code Online (Sandbox Code Playgroud)

但是,这个,使用local,不:

$ fun2() { local x=$(false); echo "exit code: $?"; }
$ fun2
exit code: 0
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么要local扫描命令的返回码?

Sie*_*geX 68

local返回0 的代码的原因是$?"扩展到最近执行的前台管道的退出状态".因此$?正在回归成功local

您可以通过将声明x与初始化分开来解决此问题,x如下所示:

$ fun() { local x; x=$(false); echo "exit code: $?"; }; fun
exit code: 1
Run Code Online (Sandbox Code Playgroud)

  • 为了记录,问题在BashPitfalls wiki中讨论:http://mywiki.wooledge.org/BashPitfalls#local_varname.3D.24.28command.29 (6认同)
  • Google样式指南还针对bash进行了介绍:https://google.github.io/styleguide/shell.xml?showone=Use_Local_Variables#Use_Local_Variables (2认同)

Ign*_*ams 5

在返回代码local命令掩盖的返回码false

  • 它不是“特殊关键字”,而是内置的 shell。甚至内置函数也有返回值。 (3认同)
  • [Shellcheck](https://github.com/koalaman/shellcheck) 可以检测到这个问题([SC2155](https://github.com/koalaman/shellcheck/wiki/SC2155))。 (3认同)