Bash-tips: #1 - e-flaggan
Ni känner säker igen det. Man skriver ett skript som gör nåt nyttigt, men en dag fallerar det och det tar en massa tid att stöda upp efter allt skriptet gjorde efter det fallerade.
För att skriva mera tillförlitliga bash-skript utan att ha överdrivet mycket felkontroller kan man använda en option som automatiskt avslutar skript vid fel. Då slipper man skript som går vidare och saboterar en massa data när nåt kommando går fel. Flaggan heter ‘-e’ och kan läggas på första raden i bash-skript eller senare, då med kommandot set -e
#!/bin/bash -e trap 'echo "***error**"' 0 tar cvfz /tmpdir/arkiv.tgz * rm -rf * # Stäng av felhanteringen just före vi avslutar trap 0
I detta exempel kopierar vi först en massa filer och raderar dem sedan. Men om arkivet inte går att skapa så vill vi naturligvis inte radera allt. Med felkontroll på allt blir skripten säkrare. Utan -e skulle skriptet radera allt och tyvärr är det så många skript gör eftersom det är så jobbigt att lägga in felkontroller. I ett stabilt skript är en stor del av koden explicita felkontroller. Trap-kommandot är ett inbyggt kommando som fångar signaler, man signal(2), men även några anda händelser, t.ex. när skript avslutas vilket vi är intresserade av här för att få ut ett felmeddelande när nåt går fel.
Sen inträffar det förstås att kommandon kan ge en felkod utan att man vill terminera direkt. Det kan finnas en alternativ väg eller så vill man anpassa felmneddelandet. Om kommandot är ett villkor i en if-sats bryts inte skriptet om kommandot går fel utan if-satsen får ta hand om felkoden.
#!/bin/bash -e trap 'echo "***error**"' 0 if ! tar cvfz /tmpdir/arkiv.tgz * then tar cvfj /tmpdir/arkiv.tar.bz2 * fi rm -rf * # Stäng av felhanteringen just före vi avslutar trap 0
I detta fall provar vi att komprimera hårdare (ifall disken inte räckte till för vanlig gzip. Om bzip2-komprimeringen misslyckas terminerar skriptet.
I slutändan hamnar man på att skriva ungefär like mycket felhanteringskod med -e, främst för att få fram bra felmeddelanden, men de tidiga versionerna, där logiken är vikitigast, kommer att vara mycket mer robusta och lättare att felsöka.
2 Comments »
RSS feed for comments on this post. TrackBack URI
Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>




Tack för tipset!
Comment by Niklas Lindblad — 2006-09-06 @ 22:09
Intressant, kände inte till den flaggan. Jag skulle dock i ett fall som detta köra:
tar cvfj /tmpdir/arkiv.tar.bz2 * && rm -rf *
vilket också “tar hand om” felkontrollen.
/Lasse
Comment by Lasse — 2006-12-10 @ 10:12