如何为启用set -e的Shell脚本设置退出函数以保留终端窗口
解决脚本用
set -e时出错终端自动关闭的问题 你可以通过Shell的trap命令绑定一个退出处理函数,让脚本在退出前自动检查退出码,仅在非零退出时执行read命令阻止终端关闭,同时保留set -e的自动退出特性。
完整示例脚本
#!/bin/bash set -e # 定义退出处理函数 on_exit() { # 捕获脚本最终退出码(必须在函数开头获取,避免被后续命令覆盖) local exit_code=$? if [[ $exit_code -ne 0 ]]; then read -p "脚本执行出错,按回车键关闭终端..." fi } # 将EXIT信号绑定到处理函数,脚本退出时自动触发 trap on_exit EXIT # -------------------------- # 以下是你的业务脚本逻辑 # -------------------------- iCanCauseError echo "只有上面命令执行成功时,才会显示这行内容"
关键说明
trap on_exit EXIT:这行命令告诉Shell,当脚本触发EXIT信号(无论正常退出、错误退出还是被中断)时,自动执行on_exit函数。local exit_code=$?:在函数开头立即捕获退出码,因为$?会被后续命令的执行结果覆盖,必须优先保存。set -e的特性完全保留:任何命令执行失败时,脚本会立即退出,随后触发on_exit函数检测退出码,非零则弹出等待输入的提示,让终端保持打开以便查看日志。
额外注意
- 如果脚本正常退出(比如执行
exit 0),处理函数检测到退出码为0,不会执行read,终端会正常关闭。 - 如果脚本被
Ctrl+C中断,退出码为130,同样会触发read,方便查看中断前的执行日志。
内容的提问来源于stack exchange,提问作者Masuk Pavel
相关产品推荐
相关产品推荐

