インタラクティブコマンド(ghci)の出力をsedベースのスクリプトにパイプして色を追加しています:
ghci | colorize.sh
どこ colorize.sh
は次のようなものです:
#!/bin/bash
trap '' INT
sed '...some pattern...'
ここで、Ctrl-Cを押すと、ghciのみがそれを受信し(終了しません)、sedが繁栄し(または再起動されますか?)、ghciの出力を処理します。
このスクリプトは機能せず、理由はわかりません。
まず、これではあなたの質問に答えられないということから始めましょうが、何が起こっているのかを明確にするのに役立つことを願っています。あなたが思っていることが実際には起こっていないのではないかと思います。この簡単な例を考えてみましょう。
# 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を複数回無視し、sed
がSIGINTを処理するときに、パイプもwriter
も中断されないことに注意してください。