Isso porque ele envia SIGINT para o processo em primeiro plano, em vez de bash
(que está executando o script). Se você quiser fazer isso, torne a função assíncrona e, em seguida, use wait
(que funcionará como esperado e usará o trap).
Eu posso configurar trap
em scripts bash, mas não em funções bash.
Por exemplo, source
do código abaixo e execute f
, agora tente Ctrl + C , ele não está preso!
Como configurar trap
nas funções do bash?
4 trap ctrl_c INT
5
6 ctrl_c () {
7 echo "** Trapped CTRL-C"
8 }
9
10
11 f () {
12 for i in 'seq 1 100'; do
13 sleep 1
14 echo -n "."
15 done
16 }
Isso porque ele envia SIGINT para o processo em primeiro plano, em vez de bash
(que está executando o script). Se você quiser fazer isso, torne a função assíncrona e, em seguida, use wait
(que funcionará como esperado e usará o trap).
Protip: Envia o processo em primeiro plano um QUIT com Ctrl - \ quando Ctrl - C , - < kbd> Z , - D não estão funcionando.
Limpar armadilhas no final da execução com trap - list of signals here
Diversão em um sistema de não produção: tente definir uma armadilha para todos os sinais sensíveis (por exemplo, não KILL). kill -l
(não é um L minúsculo, nem um número 1 nem um pipe |)
Acho que você deveria tornar a função global
#!/bin/bash
trap ctrl_c INT
ctrl_c () {
echo "** Trapped CTRL-C"
}
for i in 'seq 1 100'; do
sleep 1
echo -n "."
done