bash 函数中的隐式返回?

Ale*_*lls 17 bash shell-script bash-functions

假设我有一个像这样的 bash 函数:

gmx(){
  echo "foo";
}
Run Code Online (Sandbox Code Playgroud)

这个函数会隐式返回echo命令的退出值,还是需要使用返回值?

gmx(){
  echo "foo";
  return $?
}
Run Code Online (Sandbox Code Playgroud)

我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定。

Kus*_*nda 15

return从 shell 函数或“点脚本”(源脚本)执行显式返回。如果return未执行,则在 shell 函数或点脚本的末尾进行隐式返回。

如果return不带参数执行,相当于返回最近执行的命令的退出状态。

这就是return在所有 POSIX shell 中的工作方式。

例如,

gmx () {
  echo 'foo'
  return "$?"
}
Run Code Online (Sandbox Code Playgroud)

因此等价于

gmx () {
  echo 'foo'
  return
}
Run Code Online (Sandbox Code Playgroud)

这与

gmx () {
  echo 'foo'
}
Run Code Online (Sandbox Code Playgroud)

一般来说,您很少需要使用它$?。只有当您需要保存它以备将来使用时才真正需要它,例如,如果您需要多次调查其值(在这种情况下,您会将其值分配给一个变量并对该变量执行一系列测试)。

  • 使用 `return` 的一个缺点是,对于像 `f() (...; cmd; return)` 这样定义的函数,它阻止了一些 shell 在与子 shell 相同的进程中运行 `cmd` 所做的优化. 对于许多 shell,这也意味着函数的退出状态不携带 `cmd` 已被杀死的信息(大多数 shell 无论如何都无法检索该信息)。 (3认同)

Ign*_*ams 9

bash(1)手册页:

执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。

  • “return [n]:使函数停止执行并将 n 指定的值返回给其调用者。如果省略 n,则返回状态是函数体中执行的最后一个命令的状态。” *(ibid)* 因此,如果指定,`return` 会强制函数的退出状态为特定值。 (2认同)