bash - 陷阱不退出循环
问题描述
我正在尝试使用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
,这是一个无限循环
解决方案
信号 1 是 SIGHUP,如果终端消失,例如因为您从远程计算机连接并且您的会话因网络断开而中断,则会引发该信号。当你按下 Ctrl+C 时,这会发送 SIGINT。
trap safe_cancel HUP INT
这可能与您使用 Git 时遇到的错误有关,也可能无关。
推荐阅读
- java - dropwizard 中 Cronjob 的多线程
- java - 我可以为不同的用途创建相同的类并为不同的 JsonProperty 传递一个字符串吗
- android - 适用于 Android 的 Kivy 应用程序无法加载图像
- python - 为什么 Python 的方差计算不包括 Bessel 的校正?
- typescript - 如何声明元组类型的联合,以便在解构后,变量的类型仍然保持关联
- python - 在反向消除代码中获取 TypeError
- javascript - svelte svelte-range-slider-pips 生成“springPositions”不是具有“订阅”方法的商店
- maven - 未执行 maven-dependency-plugin 中的目标复制依赖项
- java - Spring boot - 存储库保存之前的操作
- vue.js - 自定义 vue 组件不会在值更改时更新