我有几个带有while read line循环的脚本,当我按下Ctrl C时,它们不执行我的清理功能.例如:
#!/bin/bash
cleanup() {
stty echo
exit 0
}
trap cleanup SIGINT SIGHUP SIGTERM
stty -echo
while read -r line; do
echo "$line"
done < /foo/bar
cleanup
Run Code Online (Sandbox Code Playgroud)
当我按下Ctrl-C时,我的终端被搞砸了,因为stty -echo设置仍然有效.我有许多其他脚本,我的清理功能完美无缺.我似乎遇到问题的唯一一次是当我在脚本处于read循环中时按Ctrl-C .有没有办法确保cleanup在脚本进入read循环时按下Ctrl-C时调用该函数?或者我只是错过了一些明显的东西?
更新:我的脚本中还有其他内容.我运行上面的确切脚本,我不能让它失败,就像我的其他脚本一样.我将不得不尝试将破碎的脚本提炼为我可以失败的东西,此时我将更新问题.
更新2:好的,我明白了.我收到了一个错误stty(我没有看到,因为我的真正的清理功能也在清除屏幕).错误是:stty: standard input: Inappropriate ioctl for device.我看着这件事的显然这是由于调用stty而stdin从文件被重定向/foo/bar.所以我改变了我的trap号召trap "break" SIGINT SIGHUP SIGTERM,它起作用了.