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。