首页 > 解决方案 > 为什么 return 语句在 shell 函数中的行为不符合预期?

问题描述

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

    echo "step2"
}

foo

我希望 shell 脚本输出:

step1

然而,真正的输出是:

step1

step2

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

标签: linuxbashshellunixsh

解决方案


问题似乎是管道引起的子壳。return不仅可以用于从函数返回,还可以用于从源文件返回。subshel​​l 似乎也有类似的处理;return不再是函数返回语句,而是 shell 退出语句。控制“开始”通过离开循环离开函数,但是当子shell退出时,函数“忘记”退出。或者,该函数实际上并没有看到return语句正在执行,因为它在子 shell 中执行。

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

您可以启用该lastpipe选项以获得您期望的行为,因为|它不会产生新的子外壳。


推荐阅读