No Bash 5, me deparei com uma situação em que quero fazer o seguinte:
trap 'echo trapped!' USR1
while true; do kill -SIGUSR1 $$; sleep 1; done &
Mas eu tenho que pressionar enter no teclado toda vez que o sinal é enviado para fazer o código de trap continuar.
Na verdade, espero que a armadilha seja executada sem nenhuma interação com o teclado.
EDITAR:
Finalmente consegui trabalhar assim:
trap 'echo trapped!' USR1
while true; do kill -USR1 $$; kill -INT $$; sleep 1; done &
Mas considero a solução como solução alternativa e não como resposta.
Alguém parece ter um problema muito semelhante aqui .
Para encurtar a história, se não há problema em executar o comando da armadilha incorporada em um subprocesso ('echo preso!' neste caso). Você pode colocar seus comandos em um arquivo (por exemplo
a.sh
):e execute o arquivo como um processo em segundo plano com
bash a.sh &
Se não for bom fazê-lo em um subprocesso, não há uma boa solução, pois o shell interativo faz uma operação de leitura de bloqueio enquanto espera que o usuário digite um comando e não trata a maioria dos sinais enquanto isso está acontecendo (como você notou, ele lida com SIGINT). A solução acima funciona, pois a armadilha está em um shell não interativo (portanto, não está no meio de uma leitura de bloqueio quando recebe o sinal).