You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:22:08