source Bash脚本时`return`命令的实际行为及官方文档查询
子shell中使用
return为何不会终止dot脚本执行? 问题重现
以下是最小可复现脚本:
#!/bin/bash # mre.sh (return 0) && echo SUCCESS || echo FAILURE echo DONE
执行. mre.sh后,实际输出为:
SUCCESS DONE
根据bash手册对return的描述:
return工具应使shell停止执行当前函数或dot脚本。
按照手册描述,return 0应该直接终止整个dot脚本,不会有任何输出,但实际后续的echo DONE依然执行。
原因说明
你的推测完全正确:在dot脚本的子shell中调用return,只会退出该子shell,不会终止外层的dot脚本执行。
bash官方手册中虽未在return条目下直接说明子shell场景,但结合子shell的定义可以明确这一行为:
- 括号
()创建的子shell是独立的执行环境,属于当前shell的子进程,拥有独立的执行上下文。 return的作用范围仅限当前执行上下文:在函数中调用则终止函数;在dot脚本的主执行流中调用则终止脚本;但在子shell中调用时,只会终止这个子shell进程,外层的dot脚本会继续执行子shell之后的命令。
从bash手册的COMPOUND COMMANDS章节关于子shell的描述也能佐证:
括号
()中的命令会在子shell环境中执行,子shell拥有独立的变量环境、退出状态等,子shell的退出不会影响父shell(即执行dot脚本的当前shell)的执行流程。
当(return 0)执行时,子shell执行return 0后退出,退出状态为0,因此&&后的echo SUCCESS被触发执行,之后外层脚本继续运行echo DONE。
如果要让return终止整个dot脚本,需去掉子shell,直接在主执行流中调用:
#!/bin/bash # mre.sh return 0 && echo SUCCESS || echo FAILURE echo DONE
此时执行. mre.sh不会产生任何输出,因为return 0直接终止了dot脚本的执行。
内容的提问来源于stack exchange,提问作者Flandraco
相关产品推荐
相关产品推荐

