在bash中读取stdin时如何处理中断信号
我正在玩bash读取功能。我喜欢目前为止我拥有的在我当前外壳上的一个简单层。read-e完成了tab和前面的命令,使用ctrl+d发送EOF会让我回到原来的shell。以下是我的推荐信: 我想要一些处理SIGINT,ctrl+c的帮助。在普通shell中,如果您开始键入并在中途按^C,它将立即结束该行。对于这个简单的例子,在^C之后,我仍然必须在注册它之前点击return 如何保持readline的良好功能,但仍然正确处理SIGINT?理想情况下,它会将continue语句发送到while read循环,或者以某种方式将\n发送到等待读取的STDIN 示例代码:在bash中读取stdin时如何处理中断信号,bash,readline,interactive,sigint,bash-trap,Bash,Readline,Interactive,Sigint,Bash Trap,我正在玩bash读取功能。我喜欢目前为止我拥有的在我当前外壳上的一个简单层。read-e完成了tab和前面的命令,使用ctrl+d发送EOF会让我回到原来的shell。以下是我的推荐信: 我想要一些处理SIGINT,ctrl+c的帮助。在普通shell中,如果您开始键入并在中途按^C,它将立即结束该行。对于这个简单的例子,在^C之后,我仍然必须在注册它之前点击return 如何保持readline的良好功能,但仍然正确处理SIGINT?理想情况下,它会将continue语句发送到while r
#!/bin/bash
# Emulate bash shell
gtg=1
function handleCtrl-C {
# What do I do here?
gtg=0
return
}
trap handleCtrl-C INT
while read -e -p "> " line
do
if [[ $gtg == 1 ]] ; then
eval "$line"
fi
gtg=1
done
读取man 7信号告诉某些系统调用设置了可重启标志,因此将返回到命令 对于某些系统调用,如果在调用时捕获到信号 正在执行且调用提前终止,则调用 自动重新启动。安装有信号(3)的任何处理器将 设置sau RESTART标志,这意味着任何可重启的系统调用 在收到信号时不会返回。受影响的系统调用 包括读取(2)、写入(2)、发送到(2)、recvfrom(2)、发送消息(2)和 通信信道或低速设备上的recvmsg(2),以及 在ioctl(2)或等待(2)期间。然而,已经发生的电话 未重新启动提交的,而是返回部分成功(对于 例如,短读取计数)。这些语义可以随时间而改变 信号中断(3) 您可以尝试将输入的值打印到第行,并验证在CtrlC返回后是否恢复读取,直到点击新行。输入类似“exit”的内容,然后输入Ctrl-C,然后输入“exit”,输出结果为“exitexit”。进行以下更改并针对上述测试用例运行
echo ">$line<"
if [ $gtg == 1 ] ; then
echo”>$line读取man 7信号告知某些系统调用设置了可重启标志,因此将返回到命令
对于某些系统调用,如果在调用时捕获到信号
正在执行且调用提前终止,则调用
自动重新启动。任何安装了信号(3)的处理程序都将
设置sau RESTART标志,这意味着任何可重启的系统调用
收到信号后不会返回。受影响的系统调用
包括读取(2)、写入(2)、发送到(2)、recvfrom(2)、发送消息(2)和
通信信道或低速设备上的recvmsg(2),以及
在ioctl(2)或等待(2)期间。但是,已经
未重新启动提交的,而是返回部分成功(对于
例如,一个简短的读取计数)。这些语义可以通过
信号中断(3)
您可以尝试将输入的值打印到第行,并验证在点击新行之前,在CtrlC返回后是否恢复读取。键入类似“exit”的内容,然后键入Ctrl-C,然后键入“exit”。输出结果为“exitexit”。进行以下更改并针对上述测试用例运行
echo ">$line<"
if [ $gtg == 1 ] ; then
echo”>$line我想我终于想出了我喜欢的东西。看看答案。我想我终于想出了我喜欢的东西。请参阅以获取答案。我不确定这是否是我想要的-如果我键入“退出”并按Ctrl-C,我希望它放弃退出并给我一个新提示。我不确定这是否是我想要的-如果我键入“退出”并按Ctrl-C,我希望它放弃退出并给我一个新提示。