小编Mik*_*olt的帖子

在读取循环中,Bash脚本不捕获SIGINT

我有几个带有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.我看着这件事的显然这是由于调用sttystdin从文件被重定向/foo/bar.所以我改变了我的trap号召trap "break" SIGINT SIGHUP SIGTERM,它起作用了.

bash shell

7
推荐指数
1
解决办法
1709
查看次数

标签 统计

bash ×1

shell ×1