Hogyan lehet hibakeresni egy bash szkriptet?

How Debug Bash Script




Minden programnak hibamentesnek kell lennie, mielőtt eléri a fogyasztókat. A szoftverfejlesztők mindent megtesznek annak érdekében, hogy a szoftverprogramok hibamentesek legyenek. De nehéz hibátlan kódot csinálni, ha több ezer sor van. A hibakeresés folyamatos folyamat; segít a hibák azonnali észlelésében, a kóddal kapcsolatos értékes információk összegyűjtésében és a redundáns kóddarabok kiküszöbölésében.

Minden programozási nyelvnek van néhány közös és kevés különálló megközelítése a hibák keresésére. Például a hibakeresési programok segítségével gyorsan eltávolíthatók a hibák. Míg a shell scriptelésnek nincs külön eszköze a kód hibakereséséhez. Ez az írás a különböző hibakeresési technikák megvitatásáról szól, amelyekkel a bash script hibamentessé tehető. Mielőtt belemerülnénk a módszerekbe, ismerjük meg alaposan a shell -eket és a shell scripteket:







Mi a héj Linuxon?

Amikor elindítja a számítógépet, a kernel információt kap a csatolt hardverről, és lehetővé teszi más csatlakoztatott összetevők kölcsönhatását. Ezenkívül kezeli a memóriát, a CPU -t és felismer minden új perifériát. Mindent összevetve a kernel minden operációs rendszer gerincét képezi. De valaha is gondolt arra, hogy közvetlenül kapcsolatba lépjen a kernellel, parancsot adjon neki egy adott feladat elvégzésére? Ez egyáltalán megvalósítható? Teljesen! Egy héj, egy interaktív felületű számítógépes program segítségével bárki működtetheti a kernelt. A héj lehetővé teszi az emberek számára, hogy kölcsönhatásba lépjenek a kernellel, és utasítsák bármely feladat elvégzésére.



A Unixban két fő héj létezik Bourne kagyló és C héj . Mindkét típusnak megvannak az alkategóriái. Különböző típusú Bourne kagylók vannak Korn héj (ksh), Almquist héj (hamu), Bourne ismét héj (bash), és Z héj (zsh) . Ugyanakkor a C héjnak saját alkategóriái vannak, mint például C héj (csh) és TENEX C héj (tcsh) . Amint fentebb említettük, az összes kagyló közül Bash (Bourne ismét héja) a legszélesebb körben használt shell, és sok Linux disztribúcióban kerül a dobozba a hatékonyság és a felhasználóbarát jelleg miatt.



A Bash számos Linux disztribúció alapértelmezett héja, és több millió Linux -felhasználó használja széles körben. Annyira változatos és befolyásos, hogy képes elvégezni minden olyan feladatot, amelyet általában GUI-alapú alkalmazásokban végez. Fájlokat szerkeszthet, fájlokat kezelhet, fényképeket tekinthet meg, zenét hallgathat, videókat lejátszhat és még sok minden mást tehet.





Mi az a Shell Script:

Ahogy megtanultuk a shell alapötletét, most menjünk a shell scripteléshez. A shell script egy számítógépes program, amely több parancsot hajt végre egy shell -ben, és tolmácsként működik egy adott funkció végrehajtásához. Amint azt fentebb tárgyaltuk, 2 különleges típusú kagyló létezik. Ez az útmutató azonban a Bourne Again héjra (Bash) összpontosít.
Tehát mi az a bash script? Linux alatt az összes bash parancs benne van tárolva /usr /bin és /bin mappák. Például, amikor futtat egy parancsot, a bash azt keresi, hogy létezik -e a könyvtárban vagy sem. A parancs akkor hajtódik végre, ha a könyvtárakban megtalálják, hogy más hibát ad.

Mit szólna egy olyan feladat végrehajtásához, amelynek több parancsra van szüksége a terminálon történő futtatáshoz? Ebben a konkrét helyzetben a bash script segíthet. A Bash szkriptelés a shell parancsfájlok egyik formája, amely lehetővé teszi, hogy a programokat több bash parancs futtatására késztesse egy adott feladat elvégzésére.



Mik a hibák a bash scriptelésben:

A bash szkripteléssel vagy más programozási nyelvekkel való munkavégzés során sok hibával találkozhat. A hiba olyan hiba vagy hiba a programban, amely miatt a program helytelenül viselkedhet.

Minden programozási nyelvnek megvan a maga eljárása a hibák megtalálására; hasonlóképpen a bash számos beépített opcióval rendelkezik egy terminál program hibakereséséhez.

A hibák kezelése és a program hibakeresése nem kevesebb, mint gond. Ez időigényes feladat, és súlyosbodhat, ha nincs tisztában a megfelelő eszközökkel a program hibakereséséhez. Ez az írás egy teljes útmutató a bash-szkriptek hibakereséséhez, hogy a szkript hibamentes legyen. Tehát kezdjük:

A bash szkript hibakeresése:

Ha nagy programozási projekteken dolgozik, sok hibával vagy hibával találkozik. A program hibakeresése néha bonyolult lehet. A programozók általában hibakeresési eszközöket használnak, és sok kódszerkesztő is segít a hibakeresésben a szintaxis kiemelésével.

A Linuxban számos eszköz létezik a kódok hibakeresésére, például a GNU Debugger aka gdb. Az olyan eszközök, mint a GDB, hasznosak a bináris fájlokba fordító nyelvek programozásában. Mivel a bash egyszerű értelmezett nyelv, nincs szükség nehéz eszközökre a hibakereséshez.

A bash szkriptkód hibakeresésére számos hagyományos technika létezik, és az egyik a hozzáadás Állítások. Az állítások olyan feltételek, amelyeket hozzáadnak a programokhoz, hogy ellenőrizzék a konkrét feltételeket, és ennek megfelelően hajtsák végre a programot. Ez egy védekező technika, amely segít a hibák megtalálásában és a tesztelésben is. Sokat találhat eszközöket amelyek elősegítik az állítások hozzáadását a bash szkriptekhez.

Nos, az állítások hozzáadása az egyik régi hagyományos technika. A bash -ban a zászlók/opciók állnak rendelkezésre a bash szkript hibakereséséhez. Ezek az opciók hozzáadhatók a shebang -mal együtt a szkriptekben, vagy a program végrehajtása közben a terminálban. Az alábbiakban felsoroljuk azokat a témákat, amelyeket fel fogunk venni:

  1. A bash szkript hibakeresése az engedélyezéssel bőbeszédű -v választási lehetőség
  2. A bash szkript hibakeresése a használatával xtrace -x választási lehetőség
  3. A bash szkript hibakeresése a használatával noexec -n választási lehetőség
  4. Hogyan lehet azonosítani a unset változók bash szkript hibakeresése közben
  5. Hogyan hibakeresés a konkrét részt a bash szkriptből
  6. Egy bash szkript hibakeresése a csapda parancs
  7. Hogyan lehet a bash szkriptet hibakereséssel kiküszöbölni iratgyűjtés használni a -f választási lehetőség
  8. Hogyan kell kombájn hibakeresési lehetőségek egy shell parancsfájl hibakereséséhez
  9. Hogyan kell átirányítási hibakeresési jelentés fájlba

Tehát nézzük meg a bash különböző technikáit a bash szkript hibakereséséhez:

1. A bash szkript hibakeresése a verbose -v beállítás engedélyezésével:

A bash szkript hibakeresésének egyik legegyszerűbb módja a -v opció, más néven bőbeszédű. Az opció hozzáadható a shebang használatával, vagy kifejezetten a parancsfájl nevével a végrehajtás során. A bőbeszédű opció végrehajtja és kinyomtatja a kód minden sorát, mint a tolmács folyamatát. Értsük meg egy bash script példával:

#! /bin/bash
kidobta 'Írja be a számot1'
olvasszám1
kidobta 'Írja be a számot2'
olvas2. számú
ha [ '$ szám1' -gt '$ szám2' ]
azután
kidobta 'A szám1 nagyobb, mint a szám2'
elif [ '$ szám1' -eq '$ szám2' ]
azután
kidobta 'A szám1 megegyezik a számmal'
más
kidobta 'A szám2 nagyobb, mint a szám1'
lenni

A fenti kód két számot kap a felhasználótól, majd feltételes utasításokat hajt végre annak ellenőrzésére, hogy a szám jelentősebb, kisebb vagy egyenlő -e a másik megadott számmal. Bár bármilyen szövegszerkesztő használható bash szkriptelésre, én a Vim szerkesztőt használom. A Vim egy hatékony, funkciókban gazdag szerkesztő, amely kiemeli a bash parancsfájlok szintaxisát, és csökkenti a szintaktikai hibák esélyét. Ha nincs Vim szerkesztője, akkor szerezze be az alábbi parancs futtatásával:

$sudotalálótelepítés jöttem

Hozzon létre egy bash parancsfájlt a következők használatával:

$jöttemb_script.sh

Ha még nem ismeri a Vim szerkesztőt, javaslom, hogy tanuljon hogyan kell használni a vim szerkesztőt eljárás előtt.

Most, visszatérve a szkripthez, futtassa a parancsfájlt a segítségével -v választási lehetőség:

$bash -vb_script.sh

A fenti kimeneten látható, hogy a szkript minden sora kinyomtatásra kerül a terminálban, miközben az értelmező feldolgozza őket. Ne feledje, hogy a szkript leállítja a felhasználói bevitelt, majd feldolgozza a szkript következő sorát. Amint fentebb tárgyaltuk, hogy a -v opció a shebang után helyezhető el, az alábbiak szerint:

#! / bin / bash -v

Hasonlóképpen, a részletes jelző is hozzáadható a shebang következő sorába a készlet parancs:

#! /bin/bash
készlet -v

A fent tárgyalt módszerek bármelyike ​​lehetővé teszi a bőbeszédűséget.

2 A bash szkript hibakeresése az xtrace -x opció használatával:

A végrehajtási nyomkövetés, más néven xtrace egy okos és hasznos hibakeresési lehetőség, különösen a logikai hibák nyomon követésére. A logikai hibák általában változókhoz és parancsokhoz kapcsolódnak. A változó állapotának ellenőrzéséhez a parancsfájl végrehajtása során a -x választási lehetőség. Most ismét futtassa a b_script.sh fájlt a -x zászló:

$bash -xb_script.sh

A kimenet kifejezetten mutatja az egyes változók értékét a végrehajtási folyamat során. Ismét a -x használható a shebang mellett és a shebang sor után a set paranccsal. Az xtrace a + jelet írja a szkript minden sorába.

3 A bash szkript hibakeresése a noexec -n opció használatával:

A szintaktikai hibák a hibák egyik elsődleges okai. A bash szkript szintaktikai hibakereséséhez használjuk noexec (nincs végrehajtás) mód. A noexec módhoz használt opció az -n. Csak a kód szintaktikai hibáit jeleníti meg a végrehajtás helyett. Sokkal biztonságosabb módszer a kód hibakeresésére. Végezzük el b_script.sh ismét a -n választási lehetőség:

$bash -nb_script.sh

Ha nincs szintaktikai hiba, a kód nem hajtódik végre. Most módosítsuk a kódunkat:

#! /bin/bash

kidobta 'Írja be a számot1'
olvasszám1
kidobta 'Írja be a számot2'
olvas2. számú
ha [ '$ szám1' -gt '$ szám2' ]
azután
kidobta 'A szám1 nagyobb, mint a szám2'
elif [ '$ szám1' -eq '$ szám2' ]
#azután
kidobta 'A szám1 megegyezik a számmal'
más
kidobta 'A szám2 nagyobb, mint a szám1'
lenni

Hozzászólok azután után elif . Most -n végrehajtással b_script.sh forgatókönyv:

$bash -nb_script.sh

A várakozásoknak megfelelően egyértelműen azonosította a hibát, és megjelenítette a terminálon.

4 Hogyan lehet azonosítani a beállítatlan változókat a bash szkript hibakeresése közben:

Gyakori, hogy a gépelés közben hibás a kódírás. Gyakran rosszul ír be egy változót, ami nem engedi a kód végrehajtását. Az ilyen hiba azonosításához a -u választási lehetőség. Módosítsuk újra a kódot:

#! /bin/bash
kidobta 'Írja be a számot1'
olvasszám1
kidobta 'Írja be a számot2'
olvas2. számú
ha [ '$ num1' -gt '$ szám2' ]
azután
kidobta 'A szám1 nagyobb, mint a szám2'
elif [ '$ szám1' -eq '$ szám2' ]
azután
kidobta 'A szám1 megegyezik a számmal'
más
kidobta 'A szám2 nagyobb, mint a szám1'
lenni

Az elsőben ha feltételes nyilatkozatot, átneveztem a szám1 változó szám1 . Most szám1 beállítás nélküli változó. Most futtassa a szkriptet:

$bash -ub_script.sh

A kimenet azonosította és kifejezetten megjeleníti a beállítatlan változó nevét.

5. A bash szkript adott részének hibakeresése:

Az xtrace mód feldolgozza a kód minden sorát, és kimenetet ad. A hibák megtalálása egy nagy kódban azonban időigényes lenne, ha már tudjuk, hogy melyik rész okozza a hibát. Szerencsére az xtrace lehetővé teszi a kód egy bizonyos részének hibakeresését is, ami a készlet parancs. Hely set -x annak a résznek az elején, amelyet hibakeresni kell, majd set +x a végén. Például a (z) feltételes állításait szeretném hibakeresni b_script.sh , ezért minden feltételes állítást mellékelek set -x és set +x az alábbi kódban látható lehetőségek:

#! /bin/bash
kidobta 'Írja be a számot1'
olvasszám1
kidobta 'Írja be a számot2'
olvas2. számú
készlet -x
ha [ '$ szám' -gt '$ szám2' ]
azután
kidobta 'A szám1 nagyobb, mint a szám2'
elif [ '$ szám1' -eq '$ szám2' ]
azután
kidobta 'A szám1 megegyezik a számmal'
más
kidobta 'A szám2 nagyobb, mint a szám1'
lenni
készlet+ x

Most futtassa a szkriptet a használatával bash b_script.sh .

A kimenet csak a megadott feltételek mellett hibakeresést végez.

6. A bash szkript hibakeresése a trap paranccsal:

Ha a szkript bonyolult, akkor vannak bonyolultabb technikák is a hibakereséshez. Egyikük a csapda parancs. Az csapda parancs elkapja a jeleket, és parancsot hajt végre, amikor egy adott helyzet bekövetkezik. A parancs lehet jel vagy funkció. Létrehoztam egy másik szkriptet sum_script.sh :

#! /bin/bash
csapda 'echo' $ {LINENO} sor: Az első szám $ number1, a második szám $ 2 és az összeg $ összeg ''DEBUG
kidobta 'Írja be az első számot'
olvasszám1
kidobta 'Írja be a második számot'
olvas2. számú
összeg= $[szám1 + szám2]
kidobta 'az összeg$ összeg'

Az csapda paranccsal DEBUG jelzés mutatja a változók állapotát szám1 , 2. számú és összeg minden sor végrehajtása után, amint az a következő kimeneti képen látható:

A sárga blokkok üres helyek, mert a felhasználó még nem adott meg bemenetet; ezek a helyek megtelnek, amint a felhasználó megadja az értékeket. Ez a módszer nagyon hasznos a bash szkriptek hibakeresésében is.

7. Hogyan lehet hibakeresni egy bash szkriptet, ha megszüntetjük a fájlgömböt a -f opció használatával:

A fájlkeresés egy folyamat, amely megkeresi a helyettesítő karaktereket tartalmazó fájlokat, azaz * és ? . A hibakeresés során sok esetben nem kell kiterjesztenie a fájlokat. Ilyen esetekben letilthatja a fájl globálását a -f választási lehetőség. Értsük meg egy forgatókönyvvel fglobe_script.sh :

#! /bin/bash
kidobta 'Az összes szöveges fájl megjelenítése.'
ls *.txt

A fenti kód megjeleníti az aktuális könyvtár összes szövegfájlját, hajtsa végre:

$bashfglobe_script.sh

A fájlcsökkentés kikapcsolásához használja a -f választási lehetőség:

$bash -ffglobe_script.sh

Hasonlóképpen használhatja a shebang és a készlet parancsot is:

#! /bin/bash
kidobta 'Az összes szöveges fájl megjelenítése.'
ls *.txt
készlet -f
kidobta 'Az összes szöveges fájl megjelenítése'
ls *.txt
készlet+f

Na, fuss bash fglobe_script.sh:

A mellékelt rész set -f/set +f beállítások nem dolgozta fel a helyettesítő karakterekkel ellátott parancsokat.

8. A hibakeresési lehetőségek kombinálása a shell script hibakeresésével:

A fent említett hibakeresési technikákban csak egy lehetőséget használunk, de a jobb megértés érdekében különféle lehetőségeket kombinálhatunk. Végezzük el -x és -v lehetőségek a sum_script.sh forgatókönyv. Használom a sum_script.sh forgatókönyv.

#! /bin/bash
kidobta 'Írja be az első számot'
olvasszám1
kidobta 'Írja be a második számot'
olvas2. számú
összeg= $[szám1 + szám2]
kidobta 'az összeg$ összeg'

Most hajtsa végre:

$bash -xvsum_script.sh

Mindkét -x és -v a kimenetek kombinálva vannak, ahogy az a kimeneti képen is megjelenik. Hasonlóképpen kombinálhatjuk a -u opció részletes -v hibakereséssel. Lecserélem a szám1 változó az egyiken a forgatókönyv hatodik sorában:

#! /bin/bash
van$ szám2ésösszegvan$ összeg'' DEBUG
kidobta '
Írja be az első számot'
olvassa el az 1 -es számot
kidobta '
Írja be a második számot'
olvassa el a 2 -es számot
összeg = $ [szám + szám2]
kidobta '
azösszegvan$ összeg'

A kimenet megtekintéséhez futtassa az alábbi parancsot:

$bash -uvsum_script.sh

9. Hogyan lehet átirányítani a hibakeresési jelentést egy fájlba:

A bash szkript hibakeresési jelentésének fájlba mentése sok esetben hasznos lehet. Ez egy kicsit trükkös, mert a hibakeresési jelentést egy fájlba kell átirányítani; néhány speciális változót használunk. Hajtsuk végre b_script.sh kód:

#! /bin/bash
végrehajt 5>dubug_report.log
BASH_XTRACED=„5”
PS4='$ LINENO--'
kidobta 'Írja be a számot1'
olvasszám1
kidobta 'Írja be a számot2'
olvas2. számú
ha [ '$ szám' -gt '$ szám2' ]
azután
kidobta 'A szám1 nagyobb, mint a szám2'
elif [ '$ szám1' -eq '$ szám2' ]
azután
kidobta 'A szám1 megegyezik a számmal'
más
kidobta 'A szám2 nagyobb, mint a szám1'
lenni

A kód második sorában látható, hogy a kimenetet átirányítjuk a debug_report.log fájlt a végrehajt parancs az 5. fájlleíróval (FD5).

exec 5> debug_report.log: Az végrehajt parancs átirányítja a shellben történteket egy fájlba debug_report.log.

BASH_XTRACEFD = 5: Ez egy egy adott bash változó és nem használható más burokban. Érvényes fájlleírót kell hozzárendelni, és a bash a kicsomagolt kimenetet írja ide debug_report.log.

PS4 = $ LINENO - ': Ez is egy bash változó, amelyet a sor számának nyomtatására használnak hibakeresés közben az xtrace módban. A PS4 alapértelmezett értéke a + jel

A fenti szkript naplófájlt hoz létre debug_report.log, olvasásához használja a macska parancs:

Következtetés:

A hibákkal teli kód hatással lehet a program teljesítményére és káros a hardverre is. A hibakeresés nagyon fontos minden program számára, mivel hatékonyabbá teszi a programot. Ha meglévő és lehetséges hibákat talál a program fejlesztése során, megakadályozhatja, hogy a program váratlanul viselkedjen. A nagy kódok általában aktív hibakeresést igényelnek, fokozva a kód hatékonyságát azáltal, hogy kiküszöbölik az igénybe vevő kódrészleteket.

Sok programozási nyelv és környezet saját kísérő hibakeresővel rendelkezik. A bash szkriptekben különféle technikák valósíthatók meg a szkript hibakereséséhez. Ez az útmutató alaposan összpontosított az összes módszerre, amelyekkel hibákat találhat a bash parancsfájlokban. Tehát amikor úgy érzi, hogy a bash szkriptje nem a várt módon viselkedik, használja a fent említett technikák bármelyikét, de az xtrace mód (-x) a legtöbb esetben nagyon hasznos.