首页 > 解决方案 > 陷阱不退出循环

问题描述

我正在尝试使用trap命令进行清理。当我点击 a但脚本没有退出safe_cancel时,正在调用该函数。Ctrl + C我必须使用Ctrl + Z暂停脚本,然后kill.

foo是我的 PATH 中的另一个脚本,exit 1如果它收到无效参数,则返回一个。

我在这个脚本中缺少什么或做错了什么?

#!/bin/bash

safe_cancel () {
    echo "Cancelling..."
    # do some cleanup here
    exit 1
}

trap safe_cancel 1

while true; do
    read -p "Choose an option: " someOption < /dev/tty
    foo $someOption
    if [[ $? == 0 ]]
    then
        break
        exit 0
    fi
done

额外细节:

我正在为 Git 钩子编写这个脚本。显然,git hooks 并不完全期望标准输入/输出,所以我必须明确使用/dev/tty

编辑:

将其用作 git 钩子的一部分时,我收到错误
read: read error: 0: Input/output error
,这是一个无限循环

标签: bashshellgithooks

解决方案


信号 1 是 SIGHUP,如果终端消失,例如因为您从远程计算机连接并且您的会话因网络断开而中断,则会引发该信号。当你按下 Ctrl+C 时,这会发送 SIGINT。

trap safe_cancel HUP INT

这可能与您使用 Git 时遇到的错误有关,也可能无关。


推荐阅读