我通过基于 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"
现在,当我运行两者时,将输出传输writer
到reader
:
$ ./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