Como configurar o trap nas funções bash?

13

Eu posso configurar trapem scripts bash, mas não funções bash.

Por exemplo, sourceo código abaixo e execute f, agora tente Ctrl+ C, não foi preso!

Como configurar trapnas 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 } 
Cheng
fonte
2
Você pode colocar um fno final do seu código e remover o espaço do f ().
GWF 11/11

Respostas:

7

Isso bashocorre porque ele envia o SIGINT ao processo em primeiro plano, em vez de para (que está executando o script). Se você quiser fazer isso, torne a função assíncrona e use wait(que atuará como esperado e usar a interceptação).

Chris Down
fonte
Isso meio que funciona. Mas eu achei que se festá em um cano echo 123 | f, então não está preso?
Cheng
@Cheng Use um subshell (e um pipe neste caso é desnecessário de qualquer maneira, basta usar um heredoc / herestring). (command | command) &
Chris Baixo
1

Protip: envie um QUIT ao processo de primeiro plano com Ctrl- \quando Ctrl- C, - Z, - Dnão está funcionando.

Limpar armadilhas no final da execução com trap - list of signals here

Diversão em um sistema que não é de produção: Tente configurar uma interceptação para todos os sinais sensíveis (por exemplo, não KILL). kill -l(não é um L minúsculo, não é o número 1 ou tubo |)

Barry A.
fonte
0

Eu acho que você deve 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
harish.venkat
fonte
INTe SIGINTsão sinônimos - não fará diferença.
Chris Baixo