在bash中读取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

我正在玩bash读取功能。我喜欢目前为止我拥有的在我当前外壳上的一个简单层。read-e完成了tab和前面的命令,使用ctrl+d发送EOF会让我回到原来的shell。以下是我的推荐信:

我想要一些处理SIGINT,ctrl+c的帮助。在普通shell中,如果您开始键入并在中途按^C,它将立即结束该行。对于这个简单的例子,在^C之后,我仍然必须在注册它之前点击return

如何保持readline的良好功能,但仍然正确处理SIGINT?理想情况下,它会将continue语句发送到while read循环,或者以某种方式将\n发送到等待读取的STDIN

示例代码:

#!/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,我希望它放弃退出并给我一个新提示。