我有while read line
循環,即不執行我的清理功能幾個腳本時,我按下Ctrl C.例如:bash腳本沒有趕上SIGINT而在讀取循環
#!/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
當我按Ctrl- C,因爲stty -echo
設置仍然有效,所以我的終端被搞亂了。我有許多其他腳本,我的清理功能完美無瑕。我似乎遇到問題的唯一時間是在腳本處於read
循環中時按Ctrl-C。有沒有辦法確保當腳本在read
循環中時按下Ctrl-C時cleanup
函數會被調用?或者我在這裏錯過了一些明顯的東西?
更新:在我的腳本中還有其他事情正在進行。我運行了上面的確切腳本,並且我無法讓它以我其他腳本的方式失敗。我將不得不嘗試提煉出破損的腳本,以便我可以失敗,此時我會更新問題。
更新2:好的,我想通了。我從stty
(我沒有看到,因爲我的真正的清理功能也清除屏幕)出現錯誤。錯誤是:stty: standard input: Inappropriate ioctl for device
。我看起來很明顯是因爲撥打stty
,而stdin
從文件/foo/bar
重定向。所以我改變了我的trap
電話trap "break" SIGINT SIGHUP SIGTERM
,它的工作。
試試這個:https://stackoverflow.com/a/13058864/2591612 – Brian
這是一個錯字。我的實際腳本使用'<'。抱歉。 –
請將您的解決方案作爲答案發布,並儘可能地接受。 –