web-dev-qa-db-ja.com

INT信号を無限に何度もトラップする方法は?

インタラクティブコマンド(ghci)の出力をsedベースのスクリプトにパイプして色を追加しています:

ghci | colorize.sh

どこ colorize.shは次のようなものです:

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

ここで、Ctrl-Cを押すと、ghciのみがそれを受信し(終了しません)、sedが繁栄し(または再起動されますか?)、ghciの出力を処理します。

このスクリプトは機能せず、理由はわかりません。

2
Łukasz Lew

まず、これではあなたの質問に答えられないということから始めましょうが、何が起こっているのかを明確にするのに役立つことを願っています。あなたが思っていることが実際には起こっていないのではないかと思います。この簡単な例を考えてみましょう。

# 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も中断されないことに注意してください。

1
Andy Dalton