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


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

我希望shell脚本输出:

step1

然而,实际输出是:

step1

step2

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

问题似乎是管道引发的子shell。return不仅可以用于从函数返回,还可以用于从源文件返回。潜艇外壳似乎受到了类似的对待;return不再是函数返回语句,而是shell退出语句Control";开始";通过离开循环来离开函数,但是当子shell退出时,函数";忘记";退出。或者,函数实际上并没有看到return语句执行,因为是在子shell中执行的

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

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

最新更新