gpt4 book ai didi

bash 从陷阱内部读取中断

转载 作者:行者123 更新时间:2023-12-04 07:23:21 25 4
gpt4 key购买 nike

当用户中断从他们从 shell 调用的这个 bash shell 函数的读取时尝试恢复 echo:

setsecret() { stty -echo; read $1; stty echo; }
如果在读取过程中输入 ctrl-c, stty echo没有被调用,所以我必须从 shell 手动完成。没什么大不了的,但宁愿不必这样做。
到目前为止,我有这个:
break_from_setsecret() { 
stty echo
trap - INT
echo "Press ENTER alone to cancel command (instead of Ctrl-C, which would mess up your terminal echo)"
}
setsecret() {
trap break_from_setsecret INT
echo "Type in a secret and press ENTER (press ENTER alone to cancel the commmand):"
stty -echo
read $1
stty echo
}
这是对在 shell 中关闭 echo 时必须键入“stty echo”的净改进。但并不完美:
  • 处理程序返回后,读取实际上会恢复;所以你必须按 ENTER(根据我在处理程序中添加的消息)
  • 如果不是按 ENTER,而是第二次键入 ctrl-c(即在处理程序回显之后),shell 将退出(但如果您按 Enter 并且命令结束,您可以在 shell 中键入 ctrl-c ,一切都回来了正常)。

  • 我尝试通过“重新提升”来自 break_from_setsecret 的信号来取消读取。通过 kill -n INT $$但这不起作用(它退出了我的 shell )。有没有办法做到这一点?
    或者,如果有一种方法可以注册 setsecret() 的清理函数会在结束时调用(甚至从 ctrl-c 开始),但我认为 bash 不支持这一点。我尝试使用陷阱 ERR 而不是 INT 但处理程序在读取期间不会在 ctrl-c 上被调用(即使如果您在正常读取期间按 ctrl-c,读取的退出代码是非零的)。
    编辑 :
    最新的解决方法是通过将处理程序更改为以下内容来吞噬 ctrl-c:
    break_from_setsecret() { 
    echo "Press ENTER alone to cancel command (instead of Ctrl-C, which would mess up your terminal echo)"
    }
    但是让清理方法工作仍然很好。

    最佳答案

    您可以设置 trapSIGNTRETURN设置 stty echo背部:

    setsecret() { 
    stty -echo
    trap 'stty echo; trap - SIGINT RETURN; echo; return' SIGINT RETURN
    read -p 'Type in a secret (pressing ENTER or ctrl-C will cancel this commmand): ' "$1"
    }

    关于bash 从陷阱内部读取中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68365444/

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