Bash Shell -skriptin vianmääritys Linuxissa tai UNIXissa

loka 6, 2021
admin

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.
Miten virheenkorjaus bash-skriptistä Linuxissa tai Unixissa
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"
OR
DEBUG 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:

How To Debug a Bash Shell Script Under Linux or UNIX Using Vim Syntax Highlighting Feature

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

🐧 Hanki uusimmat oppaat Linuxista, avoimesta lähdekoodista & DevOpsista RSS-syötteen tai viikoittaisen sähköpostiuutiskirjeen kautta.
🐧 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

Vastaa

Sähköpostiosoitettasi ei julkaista.