Bash:括号中的“ return 0”为什么不退出功能

时间:2019-08-24 20:58:02

标签: bash shell

在以下bash代码示例中。我希望return 0调用函数时会退出0。但是,该功能继续向前。

ignoringReturnStatement(){
  local seconds="$1"
  [[ "$seconds" -eq "0" ]] && (echo "equals 0" && return 0 )

  echo "Didn't exit with 'return 0'"
  return 1
}
ignoringReturnStatement 0 && echo "Return code truthy" || echo "Return code falsy"

输出

equals 0
Didn't exit with 'return 0'
Return code falsy

世界上为什么return 0被忽略?是否以某种方式限制了其所在的括号()的范围? (我习惯于不进行大量的范围缩小操作,这将非常令人惊讶)

我可以使用更详细的if syntax来重构此代码,使其按预期工作:

respectingReturnStatement(){
  local seconds="$1"
  if [[ "$seconds" -eq "0" ]]; then
     echo "equals 0"
     return 0
  fi

  echo "Didn't exit with 'return 0'"
  return 1
}
respectingReturnStatement 0 && echo "Return code truthy" || echo "Return code falsy"

但是为什么&& (... return 0)语法在这里不起作用?

1 个答案:

答案 0 :(得分:3)

它没有被忽略;它在子shell中执行。它是否失败对我来说不是立即显而易见的,因为它没有在该外壳程序的函数中使用,或者是否从该子外壳程序“返回”到该函数。

要解决此问题,请使用{...}而不是(...),以使return与其他函数在同一外壳中执行。

foo (){
  local seconds="$1"
  [[ "$seconds" -eq "0" ]] && { echo "equals 0"; return 0; }

  echo "Didn't exit with 'return 0'"
  return 1
}

没有理由在&&上使用;,因为即使出于某种罕见的原因echo失败,您也想返回。