Bash Shell -skriptin vianmääritys Linuxissa tai UNIXissa
Postilaukusta:
Kirjoitin pienen hello world -skriptin. Miten voin debugata bash shell -skriptiä, joka on käynnissä Linux- tai Unix-tyyppisissä järjestelmissä?
Se on yleisin kysymys, jonka uudet sysadminit tai Linux/UNIX-käyttäjät kysyvät. Shell-skriptien virheenkorjaus voi olla työlästä (lue: ei helppoa). Shell-skriptin virheenkorjaukseen on erilaisia tapoja.
Bash-skriptin jokaisen rivin läpikäyminen edellyttää -x- tai -v-argumentin antamista bash-skriptille.
Katsotaanpa, miten virheenkorjaus bash-skriptistä, joka pyörii Linuxissa ja Unixissa, voidaan suorittaa erilaisin menetelmin.
-x-vaihtoehto bash-kuoreskriptin debuggaamiseen
Ajoita kuoreskripti -x-vaihtoehdolla.$ bash -x script-name
$ bash -x domains.sh
Set-rakennetun komennon käyttö
Bash-kuoreskripti tarjoaa debuggausvaihtoehtoja, jotka voidaan kytkeä päälle tai pois päältä set-komennolla:
- set -x : Näyttää komennot ja niiden argumentit sitä mukaa, kun niitä suoritetaan.
- set -v : Näyttää komentotulkin syöttörivit, kun niitä luetaan.
Voit käyttää edellä mainittuja kahta komentoa itse komentosarjassa:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Voit korvata vakiomuotoisen Shebang-linjan:#!/bin/bash
seuraavalla (debuggausta varten) koodilla: #!/bin/bash -xv
Älykkään DEBUG-funktion käyttö
Lisää ensin erityinen muuttuja nimeltä _DEBUG. DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Kun lopetat debuggauksen (ja ennen kuin siirrät skriptisi tuotantoon), aseta _DEBUG tilaan ’off’. Debug-rivejä ei tarvitse poistaa._DEBUG="off" # set to anything but not to 'on'
Esimerkki skriptistä:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
Tallenna ja sulje tiedosto. Suorita skripti seuraavasti:$ ./script.sh
Tulos:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Säädä nyt DEBUG pois päältä (sinun on muokattava tiedostoa):_DEBUG="off"
Suorita skripti:$ ./script.sh
Tulos:
Found in xyz.txt file2 + 3 = 5
Ylläoleva on yksinkertainen, mutta varsin tehokas tekniikka. Voit myös kokeilla käyttää DEBUG:ia aliasina funktion sijasta.
Yleisten Bash-skriptivirheiden vianmääritys
Bash tai sh tai ksh antaa erilaisia virheilmoituksia ruudulle, ja monissa tapauksissa virheilmoitus ei välttämättä anna yksityiskohtaista tietoa.
Hylätty hakea execute-oikeutta tiedostoon
Kun kirjoitat ensimmäistä hello world -bash-shellskriptiäsi, saatat päätyä saamaan virheilmoituksen, joka kuuluu seuraavasti:bash: ./hello.sh: Permission denied
Setää käyttöoikeus chmod-komennolla:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
End of file unexpected Error
Mikäli saat tiedoston End of file unexpected -virheilmoituksen, avaa skriptitiedostosi ja tarkista, että siinä on sekä avaavat että sulkevat lainausmerkit.
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Puuttuvat avainsanat kuten fi, esac, ;; jne.
Jos puuttuu päättävä avainsana, kuten fi tai ;;, saat virheilmoituksen, kuten ”xxx unexpected”. Varmista siis, että kaikki sisäkkäiset if- ja case-lauseet päättyvät oikeisiin avainsanoihin. Katso bashin man-sivulta syntaksivaatimukset. Tässä esimerkissä fi puuttuu:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Ohjausskriptin siirtäminen tai muokkaaminen Windows- tai Unix-laatikoilla
Ei skriptiä saa laatia Linuxissa/Unixissa eikä siirtää Windowsiin. Toinen ongelma on bash shell-skriptin muokkaaminen Windows 10:ssä ja siirtäminen/siirtäminen Unix-palvelimelle. Se johtaa virheeseen, kuten komento ei löytynyt, koska kuljetuksen palautus (DOS CR-LF). Voit muuntaa DOS:n newlines CR-LF:n Unix/Linux-muotoon seuraavalla syntaksilla: dos2unix my-script.sh
Vinkki 1 – Lähetä virheviesti stderr:ään
Standard error on oletusarvoinen virhetulostuslaite, johon kirjoitetaan kaikki järjestelmän virheilmoitukset. On siis hyvä idea lähettää viestit oletusvirheasemaan:
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
Vinkki 2 – Kytke päälle syntaksin korostus käyttäessäsi vim-tekstinkäsittelyohjelmaa
Useimmissa nykyaikaisissa tekstinkäsittelyohjelmissa on mahdollista asettaa vaihtoehto syntaksin korostukselle. Tämä on hyödyllistä syntaksin havaitsemiseksi ja yleisten virheiden, kuten avaavan tai sulkevan lainausmerkin, estämiseksi. Voit nähdä bash-skriptin eri väreillä. Tämä ominaisuus helpottaa kirjoittamista shell-skriptin rakenteisiin ja syntaksivirheet erottuvat visuaalisesti. Korostus ei vaikuta itse tekstin merkitykseen; se on tehty vain sinua varten. Tässä esimerkissä vim-syntaksin korostusta käytetään bash-skriptissäni:
Kuva 01: Bash-skriptin syntaksin korostus vim-tekstieditorin avulla
Vinkki 3 – Käytä shellcheckiä skriptin niputtamiseen
ShellCheck on staattisen analyysin työkalu komentosarjan komentosarjan komentosarjaa varten. Sen avulla voi löytää virheitä shell-skripteistä. Se on kirjoitettu Haskell-kielellä. Voit löytää varoituksia ja ehdotuksia bash/sh shell-skripteille tämän työkalun avulla. Katsotaan, miten ShellCheck asennetaan ja käytetään Linuxissa tai Unixin kaltaisessa järjestelmässä parantamaan shell-skriptejäsi, välttämään virheitä ja lisäämään tuottavuutta.
Katso myös:
- Katso, miten kytket syntaksin korostuksen päälle vim-tekstieditorissa.
- Bash man page
- BASH with Debugger and Improved Debug Support and Error Handling
🐧 Tähän mennessä 24 kommenttia… Lisää yksi ↓
Kategoria | Luettelo Unix- ja Linux-komennoista |
---|---|
File Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Verkkoapuohjelmat | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Paketinhallinta | apk – apt |
Prosessien hallinta | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
Haku | grep – whereis – which |
Käyttäjätiedot | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |