Quando não interativos (como em scripts), os shells não fazem controle de job. Eles não colocam trabalhos assíncronos em segundo plano. Aqueles permanecem no mesmo grupo de processos que o resto do script, então Ctrl-C fará com que um SIGINT seja enviado para eles também (assumindo que o script em si seja iniciado em primeiro plano).
Você pode emitir um set -m
para o shell para fazer o controle do trabalho quando não interativo:
#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT
Para que isso funcione, esse script deve ser iniciado em primeiro plano. Também tome cuidado, pois se você pressionar Ctrl-Z ou se o trabalho em segundo plano tentar ler o terminal, você terá problemas.
Na minha experiência, esse tipo de truque só "funciona" em bash
ou yash
, geralmente não em outros shells parecidos com Bourne.