Git Bash运行.sh脚本文件时是否会默认创建子shell?
关于Bash脚本中exit命令未关闭终端的原理说明
你之前对大括号执行上下文的理解是正确的,{ }包裹的命令组不会创建新的子Shell,会在当前所属的Shell中执行,因此exit 1的作用逻辑是符合预期的。
核心原因:./执行脚本默认创建独立子Shell
所有符合POSIX标准的Shell(包含Git Bash内置的Bash环境)执行脚本的默认规则如下:
- 当你使用
./testScript.sh的方式运行脚本时,系统会自动创建一个全新的独立子Shell进程,专门用来运行该脚本的所有代码 exit命令的作用仅为终止它当前运行所属的Shell进程,不会向上影响父级Shell进程
你当前打开的终端窗口运行的是交互式父Shell,脚本的子Shell是它的子进程,因此脚本里的exit 1只会终止运行脚本的子Shell进程,终端对应的父交互式Shell不受影响,自然不会关闭。
现象对应逻辑
你脚本里的exit 1执行时,会直接终止整个脚本对应的子Shell进程,因此后续的testTwo函数没有机会执行,完全匹配你预期的功能表现。
对比验证:exit会关闭终端的场景
如果你使用source ./testScript.sh或者. ./testScript.sh的方式运行脚本,脚本代码会直接在当前交互式终端的Shell进程中执行,此时脚本里的exit就会直接终止当前终端的Shell进程,导致终端窗口关闭,你可以通过该操作验证上述逻辑的正确性。
Git Bash的行为说明
Git Bash本质是Windows平台移植的GNU Bash环境,执行脚本的行为和Linux、macOS原生的Bash完全一致,不存在特殊的定制逻辑,./执行脚本默认创建子Shell的规则同样适用。
内容的提问来源于stack exchange,提问作者Niveditha Karmegam
相关产品推荐
相关产品推荐

