假设我有一个像这样的 bash 函数:
gmx(){
echo "foo";
}
这个函数会隐式返回命令的退出值echo
,还是需要使用 return?
gmx(){
echo "foo";
return $?
}
我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定的。
假设我有一个像这样的 bash 函数:
gmx(){
echo "foo";
}
这个函数会隐式返回命令的退出值echo
,还是需要使用 return?
gmx(){
echo "foo";
return $?
}
我假设 bash 的工作方式,bash 函数的最终命令的退出状态是“返回”的状态,但不是 100% 确定的。
return
从 shell函数或“点脚本”(源脚本)显式返回。如果return
未执行,则在 shell 函数或点脚本的末尾进行隐式返回。如果
return
不带参数执行,则相当于返回最近执行的命令的退出状态。这就是
return
在所有 POSIX shell 中的工作方式。例如,
因此等价于
这与
一般来说,您很少需要使用它
$?
。仅当您需要保存它以备将来使用时才需要它,例如,如果您需要多次调查其值(在这种情况下,您会将其值分配给一个变量并对该变量执行一系列测试)。从
bash(1)
手册页:我将在已经提供的答案中添加一些注意事项:
尽管
return
对 shell 具有非常特殊的含义,但从语法的角度来看,它是一个 shell 内置命令,并且 return 语句的解析与任何其他简单命令一样。因此,这意味着就像在任何其他命令的参数中一样,$?
当未引用时,将受到 split+glob所以你需要引用它
$?
来避免它:return
通常不接受任何选项(虽然ksh93
's 接受通常的--help
,--man
,--author
...)。它期望的唯一参数(可选)是返回码。接受的返回码范围因外壳而异,0..255 之外的任何值是否正确反映在$?
外壳之间也各不相同。请参阅进程终止时的默认退出代码?有关详细信息。大多数 shell 接受负数(毕竟,传递给
_exit()
/exitgroup()
系统调用的参数是 anint
,因此值至少包含 -2 31到 2 31 -1,因此只有 shell 接受相同的函数范围才有意义) .大多数 shell 使用
waitpid()
and co。用于检索该退出状态的 API,但在这种情况下,当存储在$?
. 尽管调用函数不涉及生成进程并用于waitpid()
检索其退出状态,因为所有操作都在同一个进程中完成,但许多 shellwaitpid()
在调用函数时也会模仿这种行为。这意味着即使你return
用负值调用,$?
也会包含一个正数。现在,在那些
return
接受负数的 shell(ksh88、ksh93、bash、zsh、pdksh 和除 mksh、yash 以外的衍生工具)中,有一些(pdksh 和 yash)需要写,return -- -123
否则-123
视为三个-1
,-2
,-3
无效的选项。由于 pdksh 及其衍生物(如 OpenBSD
sh
或posh
)在 中保留负数$?
,这意味着return "$?"
当包含负数时执行将失败$?
(当最后一个运行命令是返回负数的函数时会发生这种情况)。所以
return -- "$?"
在那些贝壳里会更好。但是请注意,虽然大多数 shell 都支持该语法,但该语法不是 POSIX,并且实际上不支持mksh
ash 派生类。因此,总而言之,对于基于 pdksh 的 shell,您可以在函数的参数中使用负数,但如果这样做,
return "$@"
将无法正常工作。在其他 shell 中,return "$@"
它将起作用,您应该避免使用负数(或 0..255 之外的数字)作为return
.在我所知道的所有 shell 中,
return
从函数内部运行的子 shell 内部调用将导致子 shell 退出(如果有提供的退出状态或最后一个命令运行的退出状态),但不会导致函数返回(对我来说,不清楚 POSIX 是否为您提供了保证,有些人认为exit
应该使用它来退出函数内部的子shell)。例如将输出: