内置返回

Ern*_*A C 3 shell posix shell-builtin

根据开放集团的说法,

[t]返回实用程序将导致 shell 停止执行当前函数或点脚本。如果 shell 当前没有执行函数或点脚本,则结果未指定。

但是,如果您运行以下代码段

func () {
    ( return 1 )
    return 0
}
func
echo $?
Run Code Online (Sandbox Code Playgroud)

输出是0(我尝试了 bash 和 dash,结果相同)。因此,这似乎return不会导致 shell 停止执行当前函数,这与 POSIX 标准相矛盾。我错过了什么吗?

Mat*_*Mat 7

( return 1 )
Run Code Online (Sandbox Code Playgroud)

这在子shell中运行。它会立即终止子shell,如果您发现该shell的返回码,它将是1. 函数本身0在那之后就返回了。

(请参阅Shell 命令语言规范中的分组命令。)

{}不引入子shell的形式进行比较:

#! /bin/sh

func () {
    ( return 42 )
    echo "One:   $?"
    { return 1; }
    echo "Two:   $?"
    return 2
}

func
echo "Three: $?"
Run Code Online (Sandbox Code Playgroud)

输出(注意没有“两个”):

One:   42
Three: 1
Run Code Online (Sandbox Code Playgroud)