【问题标题】:Trap doesn't exit the loop陷阱不退出循环
【发布时间】:2020-06-22 09:29:31
【问题描述】:

我正在尝试使用trap 命令进行清理。当我点击Ctrl + C 时正在调用safe_cancel 函数,但脚本没有退出。我必须使用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
这是一个无限循环

【问题讨论】:

  • 如果您从重定向的 FD 读取 IO 错误,则明确的含义是您没有该进程的 TTY 访问权限。 /dev/tty 仅适用于具有控制 TTY 的进程。
  • 如果您没有控制 TTY,这也可以解释为什么 ctrl+c 没有传递信号(因此脚本解释器无法知道您输入了它)。
  • 顺便说一句,考虑在您的 read 命令上添加 || exit 以使循环不再无限。

标签: bash shell githooks


【解决方案1】:

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

trap safe_cancel HUP INT

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多