gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:57:51 24 4
gpt4 key购买 nike

我有几个带有 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

当我按下 Ctrl-C 时,我的终端机被搞砸了,因为 stty -echo 设置仍然有效。我有许多其他脚本,我的清理功能可以完美运行。我似乎遇到问题的唯一一次是在脚本处于 read 循环时按下 Ctrl-C。有没有办法确保在脚本处于 read 循环内时按下 Ctrl-C 时调用 cleanup 函数?还是我只是遗漏了一些明显的东西?

更新:我的脚本中发生了一些其他事情。我运行了上面的确切脚本,但我不能让它像我的其他脚本那样失败。我将不得不尝试将损坏的脚本提炼成我可以失败的东西,届时我将更新问题。

更新 2: 好的,我明白了。我从 stty 收到错误(我没有看到,因为我真正的清理功能也在清除屏幕)。错误是:stty:标准输入:设备的 ioctl 不合适。我查了一下,显然是由于调用 sttystdin 从文件 /foo/bar 重定向而来。所以我将 trap 调用更改为 trap "break"SIGINT SIGHUP SIGTERM 并且它起作用了。

最佳答案

原来问题是因为我的cleanup 函数正在调用stty,而stty 显然不喜欢在从文件重定向 stdin 时被调用。因此,当我在脚本执行 read 循环时按下 Ctrl-C 时,cleanup 函数被调用,就像我在循环中调用它一样:

while read -r line; do
...
cleanup
...
done < "$filename"

反过来,这意味着 stty 是使用重定向的 stdin 执行的,并且它因错误 stty: standard input: Inappropriate ioctl for device 而终止

我能够通过更改我的 trap 行来解决这个问题:

trap "break" SIGINT SIGHUP SIGTERM

因此,当我按下 Ctrl-C 时,它并没有有效地将对 cleanup 的调用插入到我的循环中,而是(有效地)将 break 插入到循环中,从而跳出循环并随后通过循环后的行调用 cleanup 函数。

关于Bash 脚本在读取循环中未捕获 SIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com