Kuinka korjata bash -skripti?

How Debug Bash Script




Kaikkien ohjelmien on oltava virheettömiä, ennen kuin ne tavoittavat kuluttajat. Ohjelmistokehittäjät yrittävät parhaansa mukaan tehdä ohjelmista virheettömiä. Mutta on vaikea tehdä koodista virheetöntä, kun on tuhansia rivejä. Virheenkorjaus on jatkuva prosessi; se auttaa havaitsemaan virheet välittömästi, keräämään arvokasta tietoa koodista ja poistamaan tarpeettomat koodipalot.

Kaikilla ohjelmointikielillä on joitain yhteisiä ja vähän erillisiä lähestymistapoja virheiden löytämiseen. Esimerkiksi virheenkorjausohjelmilla voidaan poistaa virheet nopeasti. Shell -komentosarjoissa ei ole erityistä työkalua koodin virheenkorjaukseen. Tässä kirjoituksessa keskustellaan erilaisista virheenkorjaustekniikoista, joiden avulla bash-skripti voidaan tehdä virheettömäksi. Ennen kuin sukellamme menetelmiin, ymmärrämme perusteellisesti kuoret ja komentosarjat:







Mikä on kuori Linuxissa?

Kun käynnistät tietokoneen, ydin saa tietoja liitetystä laitteistosta ja mahdollistaa muiden liitettyjen komponenttien vuorovaikutuksen. Sen lisäksi se hallitsee muistia, prosessoria ja tunnistaa kaikki uudet oheislaitteet. Kaiken kaikkiaan ydin on minkä tahansa käyttöjärjestelmän selkäranka. Mutta oletko koskaan ajatellut olla vuorovaikutuksessa suoraan ytimen kanssa, komentaa sitä suorittamaan tietyn tehtävän? Onko se edes käytännössä mahdollista tehdä? Ehdottomasti! Kuoren, tietokoneohjelman ja interaktiivisen käyttöliittymän avulla kuka tahansa voi käyttää ydintä. Kuoren avulla ihmiset voivat olla vuorovaikutuksessa ytimen kanssa ja ohjata sitä suorittamaan minkä tahansa tehtävän.



Unixissa on kaksi pääkuorta Bournen kuori ja C -kuori . Molemmilla näistä tyypeistä on alakategoriansa. Erilaisia ​​Bourne -kuoria on Korn -kuori (ksh), Almquist -kuori (tuhka), Bourne -kuori (bash), ja Z -kuori (zsh) . Samaan aikaan C -kuorella on omat alakategoriansa, kuten C -kuori (csh) ja TENEX C -kuori (tcsh) . Kuten edellä mainittiin, kaikista kuorista Bash (Bourne taas kuori) on yleisimmin käytetty kuori ja se tulee pakkauksesta monissa Linux-jakeluissa tehokkuutensa ja käyttäjäystävällisyytensä vuoksi.



Bash on monien Linux -jakelujen oletuskuori, ja miljoonat Linux -käyttäjät käyttävät sitä laajasti. Se on niin monipuolinen ja vaikutusvaltainen, että se pystyy suorittamaan kaikki tehtävät, joita tavallisesti teet GUI-pohjaisissa sovelluksissa. Voit muokata tiedostoja, hallita tiedostoja, katsella valokuvia, kuunnella musiikkia, toistaa videoita ja paljon muuta.





Mikä on Shell -skripti:

Kuten olemme oppineet kuoren perusajatuksen, siirrytään nyt kohti komentosarjoja. Shell -komentosarja on tietokoneohjelma, joka suorittaa useita komentoja kuorissa, joka toimii tulkkina suorittaakseen tietyn toiminnon. Kuten edellä mainittiin, on olemassa 2 erityistä kuortyyppiä. Tämä opas keskittyy kuitenkin Bourne Again -kuoreen (Bash).
Joten mikä on bash -käsikirjoitus? Linuxissa kaikki bash -komennot tallennetaan /usr /bin ja /bin kansioita. Esimerkiksi aina, kun suoritat komennon, bash etsii, onko se olemassa hakemistossa vai ei. Komento suoritetaan, jos se löytää hakemistosta, mikä antaa virheen.

Entä sellaisen tehtävän suorittaminen, joka vaatii useita komentoja suoritettavaksi päätelaitteessa? Tässä erityistilanteessa bash -komentosarja voi auttaa sinua. Bash -komentosarja on eräs komentosarjojen muoto, jonka avulla voit saada ohjelmia suorittamaan useita bash -komentoja tietyn tehtävän suorittamiseksi.



Mitä virheitä bash -komentosarjoissa on:

Työskennellessäsi bash -komentosarjojen tai muiden ohjelmointikielien kanssa saat monia virheitä. Vika on virhe tai vika ohjelmassa, joka voi saada ohjelman toimimaan väärin.

Jokaisella ohjelmointikielellä on oma toimintatapansa virheiden etsimiseen; vastaavasti bashilla on myös monia sisäänrakennettuja vaihtoehtoja pääteohjelman virheenkorjaukseen.

Virheiden hallinta ja ohjelman virheenkorjaus on vähintään vaivaa. Se on aikaa vievää työtä ja voi pahentua, jos et ole tietoinen oikeista työkaluista ohjelman vianetsintään. Tämä kirjoitus on täydellinen opas bash-komentosarjojen virheenkorjauksesta, jotta skriptisi olisi virheetön. Aloitetaan siis:

Bash -komentosarjan vianetsintä:

Kun työskentelet suurissa ohjelmointiprojekteissa, kohtaat monia virheitä tai virheitä. Ohjelman virheenkorjaus voi joskus olla monimutkaista. Ohjelmoijat käyttävät yleensä virheenkorjaustyökaluja, ja monet koodieditorit auttavat myös vianetsinnässä korostamalla syntaksin.

Linuxissa on erilaisia ​​työkaluja koodien vianmääritykseen, esimerkiksi GNU Debugger aka gdb. Työkalut, kuten GDB, ovat hyödyllisiä ohjelmointikielissä, jotka kootaan binääritiedostoiksi. Koska bash on yksinkertainen tulkittu kieli, sen korjaamiseen ei tarvita raskaita työkaluja.

Bash -komentosarjakoodin virheenkorjaukseen on olemassa erilaisia ​​perinteisiä tekniikoita, ja yksi niistä on lisääminen Väitteet. Väitteet ovat ehtoja, jotka lisätään ohjelmiin tiettyjen ehtojen tarkistamiseksi ja ohjelman suorittamiseksi sen mukaisesti. Se on puolustava tekniikka, joka auttaa löytämään vikoja ja testaamaan myös. Voit löytää monia työkaluja jotka auttavat lisäämään väitteitä bash -skripteihin.

Väitteiden lisääminen on yksi vanhoista perinteisistä tekniikoista. Bashissa on joukko lippuja/vaihtoehtoja bash -komentosarjan vianetsintään. Nämä vaihtoehdot voidaan lisätä yhdessä shebangin kanssa komentosarjoissa tai ohjelman suorituksen aikana päätelaitteessa. Aiheet, joita aiomme käsitellä, on lueteltu alla:

  1. Bash -skriptin virheenkorjaus ottamalla käyttöön runsas -v vaihtoehto
  2. Bash -skriptin virheenkorjaus käyttämällä xtrace -x vaihtoehto
  3. Bash -skriptin virheenkorjaus käyttämällä noexec -n vaihtoehto
  4. Kuinka tunnistaa asetamattomat muuttujat bash -skriptin virheenkorjauksen aikana
  5. Kuinka debug tietty osa bash -käsikirjoituksesta
  6. Bash -komentosarjan vianetsintä käyttämällä ansa komento
  7. Kuinka korjata bash -komentosarja poistamalla se tiedostojen kerääminen käyttämällä -f vaihtoehto
  8. Miten yhdistää virheenkorjausvaihtoehdot shell -komentosarjan vianetsintään
  9. Miten uudelleenohjaus debug-raportti tiedostoon

Tarkistetaan siis erilaisia ​​bash -tekniikoita bash -komentosarjan vianetsintään:

1. Bash -skriptin virheenkorjaus ottamalla käyttöön verbose -v -vaihtoehdon:

Yksi helpoimmista tavoista bash -komentosarjan virheenkorjaukseen on -v vaihtoehto, joka tunnetaan myös nimellä verbose. Vaihtoehto voidaan lisätä shebangilla tai nimenomaisesti skriptitiedoston nimellä sen suorittamisen aikana. Monipuolinen vaihtoehto suorittaa ja tulostaa tulkin prosessin jokaisen koodirivin. Ymmärrämme sen bash -skriptiesimerkin avulla:

#! /bin/bash
heitti pois 'Anna numero1'
lukeanumero 1
heitti pois 'Anna numero2'
lukeanumero 2
jos [ ''$ numero 1'' -gt ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on suurempi kuin numero2'
elif [ ''$ numero 1'' -ekv ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on yhtä kuin numero2'
muu
heitti pois 'Numero2 on suurempi kuin luku1'
olla

Yllä oleva koodi saa käyttäjältä kaksi numeroa ja suorittaa sitten joitakin ehdollisia lausekkeita tarkistaakseen, onko numero merkittävämpi, pienempi vai yhtä suuri kuin toinen syötetty numero. Vaikka mitä tahansa tekstieditoria voidaan käyttää bash -komentosarjoihin, käytän Vim -editoria. Vim on tehokas, monipuolinen editori, joka korostaa bash-komentosarjojen syntaksia ja vähentää syntaksivirheiden mahdollisuuksia. Jos sinulla ei ole Vim -editoria, hanki se suorittamalla alla mainittu komento:

$sudosopivaAsentaa tulin

Luo bash -skriptitiedosto käyttämällä:

$tulinb_script.sh

Jos olet uusi Vim -editorissa, suosittelen oppimaan kuinka käyttää vim editoria ennen etenemistä.

Nyt takaisin komentosarjaan, suorita komentosarja käyttämällä -v vaihtoehto:

$lyödä -vb_script.sh

Yllä olevasta tulostuksesta voidaan nähdä, että komentosarjan jokainen rivi tulostetaan päätteessä, kun tulkki käsittelee niitä. Huomaa, että komentosarja lopettaa käyttäjän syöttämisen ja käsittelee sitten komentosarjan seuraavan rivin. Kuten edellä keskusteltiin, että -v vaihtoehto voidaan sijoittaa shebangin jälkeen seuraavan kuvan mukaisesti:

#! / bin / bash -v

Samoin, yksityiskohtainen lippu voidaan lisätä myös shebangin seuraavaan riviin käyttämällä aseta komento:

#! /bin/bash
aseta -v

Mikä tahansa edellä käsitellyistä menetelmistä voi mahdollistaa monitahoisuuden.

2 Bash -komentosarjan vianetsintä käyttämällä xtrace -x -vaihtoehtoa:

Suoritusjälki, joka tunnetaan myös nimellä xtrace, on älykäs ja hyödyllinen virheenkorjausvaihtoehto erityisesti loogisten virheiden jäljittämiseen. Loogiset virheet liittyvät yleensä muuttujiin ja komentoihin. Voit tarkistaa muuttujan tilan komentosarjan suorittamisen aikana käyttämällä -x vaihtoehto. Suorita nyt uudelleen b_script.sh tiedosto -x lippu:

$lyödä -xb_script.sh

Tulos näyttää nimenomaisesti kunkin muuttujan arvon suoritusprosessin aikana. Jälleen, -x voidaan käyttää shebangin vieressä ja shebang -rivin jälkeen set -komennolla. Xtrace lisää + -merkin komentosarjan jokaiseen riviin.

3 Bash -komentosarjan vianetsintä käyttämällä noexec -n -vaihtoehtoa:

Syntaksivirheet ovat yksi virheiden pääasiallisista syistä. Käytämme bash -komentosarjan syntaktiseen vianetsintään noexec (ei suoritusta) -tila. Noexec -tilassa käytetty vaihtoehto on -n. Se näyttää vain koodin syntaksivirheet sen suorittamisen sijaan. Paljon turvallisempi tapa koodin virheenkorjaukseen. Toteutetaan b_script.sh uudelleen kanssa -n vaihtoehto:

$lyödä -nb_script.sh

Koodia ei suoriteta, jos syntaksivirhettä ei ole. Muokataan nyt koodiamme:

#! /bin/bash

heitti pois 'Anna numero1'
lukeanumero 1
heitti pois 'Anna numero2'
lukeanumero 2
jos [ ''$ numero 1'' -gt ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on suurempi kuin numero2'
elif [ ''$ numero 1'' -ekv ''$ numero 2'' ]
#sitten
heitti pois 'Numero1 on yhtä kuin numero2'
muu
heitti pois 'Numero2 on suurempi kuin luku1'
olla

Minä kommentoin sitten jälkeen elif . Nyt, suorita -n b_script.sh käsikirjoitus:

$lyödä -nb_script.sh

Kuten odotettiin, se tunnisti virheen selvästi ja näytti sen päätelaitteessa.

4 Kuinka tunnistaa asetetut muuttujat bash -skriptin virheenkorjauksen aikana:

Kirjoitusvirheiden kirjoittaminen koodin kirjoittamisen aikana on yleistä. Usein kirjoitat väärin muuttujan, joka ei anna koodin suorittaa. Tällaisen virheen tunnistamiseksi käytämme -u vaihtoehto. Muokataan koodia uudelleen:

#! /bin/bash
heitti pois 'Anna numero1'
lukeanumero 1
heitti pois 'Anna numero2'
lukeanumero 2
jos [ ''$ num1'' -gt ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on suurempi kuin numero2'
elif [ ''$ numero 1'' -ekv ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on yhtä kuin numero2'
muu
heitti pois 'Numero2 on suurempi kuin luku1'
olla

Ensimmäisessä jos ehdollisen lausunnon, nimein sen uudelleen numero 1 muuttuja numero 1 . Nyt numero 1 on määrittämätön muuttuja. Suorita nyt komentosarja:

$lyödä -ub_script.sh

Tulos on tunnistanut asetetun muuttujan nimen ja näyttää sen nimenomaisesti.

5. Kuinka korjata bash -komentosarjan tietty osa:

Xtrace -tila käsittelee koodin jokaisen rivin ja antaa tuloksen. Virheiden löytäminen suuresta koodista olisi kuitenkin aikaa vievää, jos tiedämme jo, mikä osa aiheuttaa virheen. Onneksi xtrace mahdollistaa myös tietyn koodin osan virheenkorjauksen, joka voidaan suorittaa käyttämällä aseta komento. Paikka set -x sen osan alussa, joka on korjattava, ja sitten set +x lopussa. Haluan esimerkiksi korjata ehdollisia lausuntoja b_script.sh , joten liitän kaikki ehdolliset lausunnot set -x ja set +x vaihtoehtoja alla olevan koodin mukaisesti:

#! /bin/bash
heitti pois 'Anna numero1'
lukeanumero 1
heitti pois 'Anna numero2'
lukeanumero 2
aseta -x
jos [ ''$ numero'' -gt ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on suurempi kuin numero2'
elif [ ''$ numero 1'' -ekv ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on yhtä kuin numero2'
muu
heitti pois 'Numero2 on suurempi kuin luku1'
olla
aseta+ x

Suorita nyt komentosarja käyttämällä bash b_script.sh .

Tulos on virheenkorjaus vain, jos määritetyt ehdot.

6. Bash -skriptin virheenkorjaus trap -komennolla:

Jos käsikirjoituksesi on monimutkainen, on myös yksityiskohtaisempia tekniikoita virheenkorjaukseen. Yksi niistä on ansa komento. The ansa komento kerää signaalit ja suorittaa komennon tietyn tilanteen sattuessa. Komento voi olla signaali tai toiminto. Olen luonut toisen komentosarjan nimeltä sum_script.sh :

#! /bin/bash
ansa 'echo' Line $ {LINENO}: Ensimmäinen numero on $ number1, toinen numero $ number2 ja summa on $ summa ''DEBUG
heitti pois 'Anna ensimmäinen numero'
lukeanumero 1
heitti pois 'Anna toinen numero'
lukeanumero 2
summa= $[numero1 + numero2]
heitti pois 'summa on$ summa''

The ansa komento näppäimellä DEBUG signaali näyttää muuttujien tilan numero 1 , numero 2 ja summa jokaisen rivin suorittamisen jälkeen seuraavassa tulostuskuvassa:

Keltaiset lohkot ovat tyhjiä välilyöntejä, koska käyttäjä ei ole vielä syöttänyt mitään syötettä; nämä tilat täyttyvät, kun käyttäjä syöttää arvoja. Tämä menetelmä on myös erittäin hyödyllinen bash -komentosarjojen virheenkorjauksessa.

7. Miten bash -komentosarjan virheenkorjaus poistetaan poistamalla tiedostoja käyttämällä -f -vaihtoehtoa:

Tiedostojen kerääminen on prosessi, joka etsii tiedostot, joissa on jokerimerkkejä, eli * ja ? . Monissa tilanteissa sinun ei tarvitse laajentaa tiedostoja virheenkorjauksen aikana. Tällaisissa tapauksissa voit estää tiedoston loukkaamisen käyttämällä -f vaihtoehto. Ymmärrämme sen käsikirjoituksella fglobe_script.sh :

#! /bin/bash
heitti pois Näytä kaikki tekstitiedostot.
ls *.txt

Yllä oleva koodi näyttää kaikki nykyisen hakemiston tekstitiedostot, suorita:

$lyödäfglobe_script.sh

Voit poistaa tiedostojen keräämisen käytöstä käyttämällä -f vaihtoehto:

$lyödä -ffglobe_script.sh

Samoin voit käyttää sitä shebangin ja aseta komento myös:

#! /bin/bash
heitti pois Näytä kaikki tekstitiedostot.
ls *.txt
aseta -f
heitti pois Näytä kaikki tekstitiedostot
ls *.txt
aseta+f

Nyt juokse bash fglobe_script.sh:

Osa mukana set -f/set +f vaihtoehdot eivät käsitelleet yleismerkillä varustettuja komentoja.

8. Kuinka yhdistää virheenkorjausvaihtoehdot shell -skriptin virheenkorjaukseen:

Käytämme vain yhtä vaihtoehtoa edellä mainituissa virheenkorjaustekniikoissa, mutta voimme yhdistää erilaisia ​​vaihtoehtoja ymmärryksen parantamiseksi. Toteutetaan -x ja -v vaihtoehtoja sum_script.sh käsikirjoitus. Käytän sum_script.sh käsikirjoitus.

#! /bin/bash
heitti pois 'Anna ensimmäinen numero'
lukeanumero 1
heitti pois 'Anna toinen numero'
lukeanumero 2
summa= $[numero1 + numero2]
heitti pois 'summa on$ summa''

Suorita nyt:

$lyödä -xvsum_script.sh

Molemmat -x ja -v ulostulot yhdistetään, kuten tulostuskuvassa näkyy. Samoin voimme myös yhdistää -u vaihtoehto, jossa on yksityiskohtainen -v virheiden havaitsemiseksi. Olen korvaamassa numero 1 muuttuja kanssa yhdellä käsikirjoituksen kuudennella rivillä:

#! /bin/bash
On$ numero 2jasummaOn$ summa'' DEBUG
heitti pois '
Anna ensimmäinen numero''
lue numero 1
heitti pois '
Anna toinen numero''
lue numero 2
summa = $ [numero + numero2]
heitti pois '
thesummaOn$ summa''

Jos haluat tarkastella lähtöä, suorita alla mainittu komento:

$lyödä -uvsum_script.sh

9. Virheenkorjausraportin uudelleenohjaus tiedostoon:

Bash -komentosarjan virheenkorjausraportin tallentaminen tiedostoon voi olla kätevää monissa tilanteissa. Se on hieman hankala, koska virheenkorjausraportin uudelleenohjaus tiedostoon; käytämme tiettyjä muuttujia. Toteutetaan se eteenpäin b_script.sh koodi:

#! /bin/bash
toteuttaja 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
heitti pois 'Anna numero1'
lukeanumero 1
heitti pois 'Anna numero2'
lukeanumero 2
jos [ ''$ numero'' -gt ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on suurempi kuin numero2'
elif [ ''$ numero 1'' -ekv ''$ numero 2'' ]
sitten
heitti pois 'Numero1 on yhtä kuin numero2'
muu
heitti pois 'Numero2 on suurempi kuin luku1'
olla

Koodin toisella rivillä voidaan nähdä, että ohjaamme tuloksen a: han debug_report.log tiedosto käyttämällä toteuttaja komento tiedoston kuvaajalla 5 (FD5).

exec 5> debug_report.log: The toteuttaja komento ohjaa kaiken kuorissa tapahtuvan tiedostoon debug_report.log.

BASH_XTRACEFD = 5: Se on a tietty bash -muuttuja eikä sitä voi käyttää missään muussa kuorissa. Sille on määritettävä kelvollinen tiedostonkuvaaja, ja bash kirjoittaa uutetun tuloksen debug_report.log.

PS4 = $ LINENO– ': Se on myös bash -muuttuja, jota käytetään rivinumeron tulostamiseen virheenkorjauksen aikana xtrace -tilassa. PS4: n oletusarvo on + merkki

Yllä oleva komentosarja luo lokitiedoston nimeltä debug_report.log, jos haluat lukea sen, käytä kissa komento:

Johtopäätös:

Virheitä täynnä oleva koodi voi vaikuttaa ohjelman suorituskykyyn ja vahingoittaa myös laitteistoa. Virheenkorjaus on erittäin tärkeää jokaiselle ohjelmalle, koska se tekee ohjelmasta tehokkaamman. Olemassa olevien ja mahdollisten virheiden löytäminen ohjelman kehittämisen aikana voi estää ohjelmaa toimimasta odottamattomasti. Suuret koodit tarvitsevat yleensä aktiivisen virheenkorjauksen, mikä parantaa koodin tehokkuutta poistamalla käyttämättömät koodinpalat.

Monilla ohjelmointikielillä ja -ympäristöillä on omat täydentävät debuggerit. Bash -komentosarjoissa skriptin virheenkorjaus voidaan toteuttaa eri tekniikoilla. Tämä opas keskittyi perusteellisesti kaikkiin menetelmiin, joita voidaan käyttää virheiden löytämiseen bash -komentosarjoista. Joten aina kun sinusta tuntuu, että bash-skriptisi ei toimi odotetulla tavalla, käytä jotakin edellä mainituista tekniikoista, mutta xtrace-tila (-x) on useimmissa tapauksissa melko hyödyllinen.