2013-01-11 16 views
10

Weź ten skryptWyjście po pożarach pułapki

#!/bin/sh 

fd() 
{ 
    echo Hello world 
    exit 
} 

trap fd EXIT INT 

for g in {1..5} 
do 
    echo foo 
    sleep 1 
done 

chciałbym fd raz ogień, albo z Control-C lub jeśli skrypt zakończy się normalnie. Jednak jeśli uderzysz w Control-C, uruchomi się dwa razy. Jak mogę to naprawić?

Odpowiedz

9

Pułapki kaskadowe. exit 127 uruchomi pułapkę EXIT i ustawić kod wyjścia do 127, więc można powiedzieć

#!/bin/sh 

fd() { 
    echo Hello world 
    # No explicit exit here! 
} 

trap fd EXIT 
trap 'exit 127' INT 

Pamiętam nauki to z cudzych skryptów po zmaga się z różnymi obejścia problemu od kilku lat. Po tym zauważyłem, że niektóre tutoriale wyjaśniają tę technikę. Ale nie jest to wyraźnie udokumentowane w np. strona podręcznika Bash na IMHO. (Lub nie było, kiedy tego potrzebowałem, może niektóre rzeczy nie zmieniają się od 15 lat ... :-)

+0

bardzo ładna, +1 :) – drAlberT

0

co z ponownym zdefiniowaniem domyślnej pułapki?

#!/bin/sh 

fd() { 
    echo Hello world 
    trap - EXIT 
    exit 127 
} 

trap fd INT EXIT