Come impostare trap nelle funzioni bash?


13

Posso impostare gli trapscript bash ma non le funzioni bash.

Ad esempio, sourceil codice qui sotto ed esegui f, ora prova Ctrl+ C, non è stato intrappolato!

Come impostare le trapfunzioni 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
È possibile inserire un falla fine del codice e rimuovere lo spazio da f ().
GWF,

Risposte:


7

Questo perché invia SIGINT al processo in primo piano anziché a bash(che esegue lo script). Se vuoi farlo, rendi la funzione asincrona e poi usa wait(che agirà come previsto e userà la trap).


In un certo senso funziona. Ma ho scoperto che se si ftrova in una pipa echo 123 | f, allora non è intrappolato?
Cheng,

@Cheng Usa una subshell (e una pipe in questo caso non è comunque necessaria, basta usare un heredoc / herestring). (command | command) &
Chris Down, il

1

Protip: invia a QUIT il processo in primo piano con Ctrl- \quando Ctrl- C, - Z, - Dnon funzionano.

Elimina le trappole alla fine dell'esecuzione con trap - list of signals here

Divertimento su un sistema non di produzione: prova a impostare una trappola per tutti i segnali sensibili (ad esempio, non KILL). kill -l(non è una L minuscola non un numero 1 o pipe |)


0

Penso che dovresti rendere la funzione globale

#!/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 SIGINTsono sinonimi - non farà alcuna differenza.
Chris Down,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.