Acontece que tail
morre por causa do CTRL + C, mas também é enviado (SINGINT) para o pai, bash
. Como por padrão o bash morre quando recebe tal sinal, você tem que substituir o comportamento padrão de bash
quando o recebe.
Use o comando interno trap de bash(1)
para alterar isso.
Seguir o script tailf-ctrl.sh
é uma demonstração e mostra a resposta:
#!/bin/bash
function finish {
echo "CTRL-C pressed!"
}
F=testfile
echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT
echo "Hello after" > after
cat after
observe que:
- SIGINT é o sinal relacionado a CTRL + C
- primeiro trap instala uma ação personalizada relacionada ao sinal SIGINT
- segundo trap redefine o comportamento padrão do sinal SIGINT
A saída do script é:
$ bash tailf-ctrl.sh
hello
^CCTRL-C pressed!
Hello after
que mostra que o segundo arquivo é gravado para que o final do script seja atingido quando tail
morre devido ao CTRL-C
.
se você comentar o primeiro comando trap, verá que o problema aparece: o bash termina imediatamente e a saída deve ser:
$ bash tailf-ctrl.sh
hello
^C
$