Primeiro, deixe-me começar dizendo que isso não responde à sua pergunta, mas espero que possa ajudar a esclarecer o que está acontecendo. Eu suspeito que o que você acha que está acontecendo pode não estar realmente acontecendo. Considere este exemplo simples:
# 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/'
echo "done"
Agora, quando eu executo os dois, canalizo a saída de writer
para reader
:
$ ./writer | ./reader
hello
HELLO
^CINT
^CINT
^CINT
world
WORLD
^D
done
$
O script writer
lê as leituras da entrada padrão e grava na saída padrão - o canal. Os scripts reader
lêem a entrada padrão - o canal - e grava na saída padrão. Quando eu alcanço Ctrl-C
, o writer
escreve "INT"; o reader
ignora o sinal (várias vezes). Eventualmente, eu digito Ctrl-D
(EOF), e o writer
termina. Quando o reader
recebe o EOF, ele termina e escreve "concluído".
Observe que reader
ignora o SIGINT mais de uma vez e que nem o canal nem sed
são interrompidos quando o writer
manipula o SIGINT.