为什么 return 语句在 shell 函数中的行为不符合预期?

Why does return statement not behave as expected in the shell function?

function foo()
{
    ls / | while read LINE;
    do
        echo "step1"
        return
    done

    echo "step2"
}

foo

我希望 shell 脚本输出:

step1

然而,真正的输出是:

step1

step2

为什么 return 语句在 shell 函数中的行为不符合预期?

问题似乎是管道引起的subshell。 return 不仅可以用于函数中的 return,还可以用于源文件中。 subshell 似乎被类似对待; return 不再是函数 return 语句,而是 shell 退出语句。 控件通过离开循环“开始”离开函数,但是当subshell退出时,函数“忘记”退出。或者也许该函数实际上没有看到执行 return 语句,因为 它在子 shell.

中执行

(感谢@zilog 的评论让我想到了源文件的角度。)

您可以启用 lastpipe 选项以获得您期望的行为,因为 | 不会引发新的子shell。