永恒圣域先锋会

关于执行shell脚本中的exit却直接退出终端

2025-11-15 17:25:20

问题

执行shell脚本中的exit却导致直接退出终端

> vi 1.sh

echo success

exit 1

echo 666

> source 1.sh

使用 ./1.sh 执行脚本得chmod +x 1.sh,偷懒直接使用source 1.sh,结果脚本中的exit直接导致退出了终端

原因

source 1.sh这种执行方式,不创建子shell,source不是直接执行一个文件,而是从一个文本文件里面读命令行,然后执行这些命令。这也是为啥source执行脚本不用加可执行权限的原因。

如此,相当于直接在终端运行了exit,自然会退出终端。

解决

别偷懒,chmod加x权限,通过./执行脚本

==============================================

笔记整理:

Linux执行文件的几种方式

(1)./xxx.sh 执行当前目录的xxx.sh文件,当然输入完整脚本路径也行,需要xxx.sh有可执行权限

(2) sh xxx.sh 使用shell解释器来执行xxx.sh,不要求文件有可执行权限,创建子shell,子shell里面的变量父shell无法使用,对环境变量的修改也不影响父shell。父shell中的局部变量,子shell也无法使用,只有父shell的环境变量,子shell能够使用。

(3)source xxx.sh 不是执行脚本文件,而是从脚本中读取一条条指令,然后放到终端去执行。(. xxx.sh和source效果相同,作用都是使刚修改过的配置文件立即生效)

exit指令

作用: 退出当前shell终端或终止当前脚本的执行

用法:

exit

退出,退出码不变,即为最后一条指令的退出码

exit n

退出,设置退出码为n,如exit $?即设置退出码为上条指令的退出码

trap "commands" EXIT

捕捉到脚本执行结束的信息时,执行commands

关于trap指令,可点这里了解。

举例: 2.sh调用1.sh,1.sh结束时设置了退出码为123,调用方可根据退出码进行相应操作

关于退出码(exit status,或exit code)的约定:

0表示成功(Zero - Success)

非0表示失败(Non-Zero - Failure)

2表示用法不当(Incorrect Usage)

127表示命令没有找到(Command Not Found)

126表示不是可执行的(Not an executable)

>=128 信号产生

阿根廷足球新篇章:2026世界杯备战中的新星崛起与老将争位 iOS 18.1更新:苹果手机通话录音功能全面解析