Ošetření chybových stavů a reakce na signály

Pokud budeme pracovat s běžnými příkazy, může se stát, že některý z nich nebude schopen příslušnou operaci provést a selže:

  #!/bin/bash
  
  cp soubor adresar
  rm soubor

Tento skript sice nic smysluplného nedělá, ale můžeme si na něm ukázat, o co jde. Pokud totiž první příkaz (cp) selže, kopie původního souboru se nevytvoří, a pokud bude skript pokračovat dál (což bude), smaže zdrojový soubor. V tomto případě by se tedy hodilo zjistit, jestli první příkaz proběhl úspěšně, a pokud ne, zastavit průběh skriptu.

Každý správně napsaný unixový program po sobě zanechá tzv. konečný stav (exit status). To je číslo, které nám pomůže zjistit, jestli program úspěšně skončil nebo jestli skončil s chybou. Nula představuje bezchybný konec, nenulové číslo poukazuje na chybu při práci programu. Hodnota konečného stavu naposledy spuštěného programu se uchovává v proměnné $?. Toho můžeme využít a skript adekvátně upravit:

  #!/bin/bash
  
  cp soubor adresar
  if [ $? -gt 0 ]; then
    echo "Soubor se nepodarilo prekopirovat."
    exit 1
  fi
  rm soubor

Na tomto příkladě jsme si ukázali dvě věci. Jednak zpracování chybového stavu a jednak příkaz exit, který okamžitě ukončí běh skriptu. Jako parametr lze tomuto příkazu předat hodnotu, kterou má vrátit jako konečný stav. V tomto případě jsme zvolili nenulovou hodnotu, protože náš program v této situaci skončil s chybou.

Chybové stavy můžeme ošetřovat v rámci jednoho příkazu takto:

  cp soubor adresar && echo "Soubor se zkopiroval."

Dva ampersandy za sebou fungují jako speciální oddělovač příkazů. Příkaz za nimi se provede pouze v případě, že příkaz před nimi bude korektně ukončen. Opačnou možnost nabízí dvě roury:

  cp soubor adresar || echo "Nastala chyba."

V tomto případě se příkaz po dvou rourách provede pouze v situaci, kdy příkaz před nimi vrátí nenulový konečný stav.

Reakce na signály

Skripty mohou reagovat určitým způsobem na signály, které jim pošlete třeba příkazem kill. Tato znalost se nám hodí třeba proto, abyste mohli „po sobě“ uklidit, když někdo požádá o násilné ukončení vašeho skriptu.

K tomu, abyste mohli reagovat na určité signály, slouží příkaz trap. Syntaxe je následující:

  trap "příkaz" signály

Příkladem tedy může být výmaz dočasného souboru při jakémkoliv násilném ukončení skriptu:

  trap "rm $TEMP; exit" SIGHUP SIGINT SIGTERM

Pokud náš skript opatříte touto řádkou, v případě, že dojde k násilnému ukončení běhu skriptu, nezůstane po něm žádné „smetí“.

nohup

Pokud provádíte nějaký příkaz na pozadí a odhlásíte se, pošle se všem programům či skriptům, které jste nechali pracovat na pozadí, signál SIGHUP. Ten zpravidla programy zpracují tak, že se ukončí. Pokud tedy chcete spustit nějaký příkaz (program) na pozadí tak, aby se při vsšem odhlášení neukončil, můžete k tomu použít program nohup:

  nohup prikaz &

Kam dál

pokrocili/komandlajna/chybove_stavy_signaly.txt · Poslední úprava: 2009/11/12 20:56 autor: Michal Dočekal
CC Attribution-Share Alike 3.0
www.chimeric.de Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 PDF Export