为什么 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。
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。