【发布时间】: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以使循环不再无限。