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 } 

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


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


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

INTe SIGINTsão sinônimos - não fará diferença.
Chris Baixo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.