Bash 替换为局部变量时函数的返回值

Bash 替换为局部变量时函数的返回值,bash,Bash,假设我有以下两个Bash脚本: 第1版: 版本为#2秒时,具有稍微不同的foo: function foo { val=`bar` #note no 'local' echo $? echo "val: $val" } 版本#1提供了以下输出: error 0 val: 第2版给了我这样的信息: error 1 val: 在#2中包含local,似乎隐藏了bar的返回值 我认为这是因为local本身就是一个函数,并且返回0,对吗?如果是这样,是否有办法解决这个问题,将val作为

假设我有以下两个Bash脚本:

第1版:

版本为#2秒时,具有稍微不同的
foo

function foo
{
  val=`bar` #note no 'local'
  echo $?
  echo "val: $val"
}
版本#1提供了以下输出:

error
0
val:
第2版给了我这样的信息:

error
1
val:
在#2中包含
local
,似乎隐藏了
bar
的返回值


我认为这是因为
local
本身就是一个函数,并且返回0,对吗?如果是这样,是否有办法解决这个问题,将
val
作为局部变量,但仍然测试
bar
的返回值?

是的,您正在读取成功的
local
的返回值。修复方法是将变量声明与其定义分开,如下所示:

#!/bin/bash

function bar
{
  if true; then
    echo "error" >&2
    exit 1
  fi
  echo "bar"
}

function foo
{
  local val
  val=$(bar)
  echo $?
  echo "val: $val"
}

foo
输出
可能重复的@dogbane搞笑,我不记得回答过这个问题;)当然,愚蠢的我!最简单的答案就是最好的,谢谢。
#!/bin/bash

function bar
{
  if true; then
    echo "error" >&2
    exit 1
  fi
  echo "bar"
}

function foo
{
  local val
  val=$(bar)
  echo $?
  echo "val: $val"
}

foo
$ ./localtest
error
1
val: