Como interceptar o sinal INT infinitas vezes?

2

Estou enviando a saída de um comando interativo (ghci) por meio de um script baseado em sed para adicionar algumas cores:

ghci | colorize.sh

onde colorize.sh é algo como:

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

Agora, se eu pressionar Ctrl-C, quero que apenas o ghci o receba (ele não termina), e quero sed para prosperar (ou talvez ser reiniciado?) e ainda processar a saída do ghci.

Este script não funciona e eu não sei porque.

    
por Łukasz Lew 30.07.2018 / 20:59

1 resposta

1

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.

    
por 31.07.2018 / 17:45