Como configurar o trap em funções bash?

12

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 } 
    
por Cheng 25.12.2011 / 12:03

3 respostas

7

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).

    
por 25.12.2011 / 13:09
1

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 |)

    
por 29.12.2011 / 06:04
0

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
    
por 25.12.2011 / 12:32

Tags