2010-12-12 39 views
34

这猛砸片断作品我预期会:为什么“本地”扫描命令的返回码?

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

但是这样一来,使用local,并不:

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

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

+1

查看https://lists.gnu.org/archive/html/bug-bash/2010-03/msg00007.html – tokland 2016-11-23 14:31:34

回答

41

代码local返回0的原因是因为$?“扩展到最近执行的前台管道的退出状态。”因此$?正在恢复的local

成功,您可以通过从x像这样的初始化分离x声明解决这个问题:

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

我通常更喜欢在一行中定义和使用一个变量,但是这是一个可接受的解决方法。 – tokland 2010-12-12 10:59:37

+4

为了记录,该问题在BashPitfalls wiki中讨论:http://mywiki.wooledge.org/BashPitfalls#local_varname.3D.24.28command.29 – tokland 2011-04-10 14:01:12

+0

我以为我疯了......谢谢! – peteroak 2017-12-31 15:42:11

2

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

+1

是的,我明白,但本地是一个特殊的关键字,我希望不要模糊它。我想这是一个错误的假设。 – tokland 2010-12-12 10:57:07

+3

这不是一个“特殊关键字”,它是一个内置的shell。即使builtins也有返回值。 – 2010-12-12 10:58:28

+0

谢谢@Ignacio,你是对的,我将不得不检查我的脚本错误地使用“本地VAR = $(command)|| return 1” – tokland 2010-12-12 11:02:28