linux - 为什么 return 语句在 shell 函数中的行为不符合预期?
问题描述
function foo()
{
ls / | while read LINE;
do
echo "step1"
return
done
echo "step2"
}
foo
我希望 shell 脚本输出:
step1
然而,真正的输出是:
step1
step2
为什么 return 语句在 shell 函数中的行为不符合预期?
解决方案
问题似乎是管道引起的子壳。return
不仅可以用于从函数返回,还可以用于从源文件返回。subshell 似乎也有类似的处理;return
不再是函数返回语句,而是 shell 退出语句。控制“开始”通过离开循环离开函数,但是当子shell退出时,函数“忘记”退出。或者,该函数实际上并没有看到return
语句正在执行,因为它在子 shell 中执行。
(感谢@zilog 的评论让我想到了源文件的角度。)
您可以启用该lastpipe
选项以获得您期望的行为,因为|
它不会产生新的子外壳。
推荐阅读
- terraform - 如何将文件路径传递给模块?
- android - 材质对话框导入问题
- python - 合并索引上的两个数据框,去掉 key_0
- linux - 在 linux 中运行外部程序后如何返回 bash 脚本菜单?
- spring - 具有相同标识符值的不同对象
- python-3.x - 为什么烧瓶会话在从反应中发布不同的帖子时没有存储用户信息?
- angular - 如何在angular-cli中将配置传递给indexTransform?
- java - 此代码读取数据库并填充表,但列与数据不匹配
- javascript - 如何在不使用未定义的情况下在函数调用中指定(默认)参数
- .net - 尝试部署时缺少部署模板