Hallo zusammen.
Ich habe mir für die Adventszeit einen kleinen LED-Adventskranz mit dem Pi gebastelt. Das Shellscript prüft dabei alle 10 Sekunden das Datum und schaltet je nach Datum 1, 2, 3 oder 4 LEDs an.
Um bei Abbruch oder Stopp des Programms ordentlich aufzuräumen habe ich eine Funktion cleanup() eingefügt, die von trap aufgerufen wird (siehe Quelltext). Nun ist mir aufgefallen, dass es einen Unterschied macht, an welcher Stelle trap im Quelltext steht. Mir ist nicht ganz klar warum das so ist. Vielleicht kann mir das jemand von euch erklären.
Hier der Quelltext, welcher wie gewünscht funktioniert:
#!/bin/bash
Advent1=113014
Advent2=120714
Advent3=121414
Advent4=122114
erster=14
zweiter=15
dritter=18
vierter=23
init_leds()
{
for i in $erster $zweiter $dritter $vierter
do
gpio -g mode $i out
gpio -g write $i 0
done
}
set_leds()
{
if [ `date +%m%d%y` -ge $Advent1 ]
then
gpio -g write $erster 1
elif [ $datum -ge $Advent2 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
elif [ $datum -ge $Advent3 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
gpio -g write $dritter 1
elif [ $datum -ge $Advent4 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
gpio -g write $dritter 1
gpio -g write $vierter 1
else
init_leds
fi
}
cleanup()
{
init_leds
exit 0
}
init_leds
trap cleanup INT TERM EXIT
while :
do
datum=`date +%m%d%y`
set_leds
sleep 10
done
Alles anzeigen
In diesem Fall steht das Kommando trap vor der while-Schleife. Stoppe ich das Programm mit Strg+C wird das Programm beendet und alle LEDs erlöschen. Die Funktion cleanup() wird ordnungsgemäß ausgeführt.
Im folgenden Beispiel folgt das Kommando trap auf die while-Schleife. In diesem Fall bricht Strg+C zwar das Programm ab, doch wird die Funktion cleanup() nicht ausgeführt. Könnt ihr mir erklären warum das so ist?
#!/bin/bash
Advent1=113014
Advent2=120714
Advent3=121414
Advent4=122114
erster=14
zweiter=15
dritter=18
vierter=23
init_leds()
{
for i in $erster $zweiter $dritter $vierter
do
gpio -g mode $i out
gpio -g write $i 0
done
}
set_leds()
{
if [ `date +%m%d%y` -ge $Advent1 ]
then
gpio -g write $erster 1
elif [ $datum -ge $Advent2 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
elif [ $datum -ge $Advent3 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
gpio -g write $dritter 1
elif [ $datum -ge $Advent4 ]
then
gpio -g write $erster 1
gpio -g write $zweiter 1
gpio -g write $dritter 1
gpio -g write $vierter 1
else
init_leds
fi
}
cleanup()
{
init_leds
exit 0
}
init_leds
while :
do
datum=`date +%m%d%y`
set_leds
sleep 10
done
trap cleanup INT TERM EXIT
Alles anzeigen
Vielen Dank für eure Hilfe.
MfG
Tronde