如何无限多次捕获INT信号?

如何无限多次捕获INT信号?

我通过基于 sed 的脚本传输交互式命令 (ghci) 的输出以添加一些颜色:

ghci | colorize.sh

哪里colorize.sh有类似的东西:

#!/bin/bash
trap '' INT
sed '...some pattern...'

现在,如果我按 Ctrl-C,我只希望 ghci 接收它(它不会终止),并且我希望 sed 蓬勃发展(或者可能重新启动?)并仍然处理 ghci 的输出。

这个脚本不起作用,我不知道为什么。

答案1

首先,我首先要说的是,这并不能回答你的问题,但我希望可以帮助澄清正在发生的事情。我怀疑你认为正在发生的事情可能并没有真正发生。考虑这个简单的例子:

# The 'writer' reads input from standard input and
# echos it to standard output.  It handles SIGINT by
# printing INT to standard output.
$ cat writer
#!/bin/bash
function foo() {
    echo "INT"
}

trap foo INT

while read x; do echo $x; done

# The 'reader' reads input from standard input and pipes what is
# read to 'sed', which converts it to upper case.  It ignores SIGINT.
# When it receives EOF on standard input, it writes "done".
$ cat reader
#!/bin/bash
trap '' INT
cat | sed -e 's/\(.*\)/\U\1/'
echo "done"

现在,当我运行两者时,将输出传输writerreader

$ ./writer | ./reader
hello
HELLO
^CINT
^CINT
^CINT
world
WORLD
^D
done
$

writer脚本从标准输入读取数据并写入标准输出——管道。脚本reader从标准输入(管道)读取并写入标准输出。当我点击 时Ctrl-C,会writer写入“INT”;忽略reader信号(多次)。最终,我输入Ctrl-D(EOF),并且writer终止。当reader接收到 EOF 时,它终止并写入“done”。

请注意,reader多次忽略 SIGINT,并且当处理 SIGINT时,管道也不会sed被中断。writer

相关内容