Sådan debugges et Bash Shell Script under Linux eller UNIX
Fra min mailbag:
Jeg har skrevet et lille hello world script. Hvordan kan jeg debugge et bash-shell-script, der kører på et Linux- eller Unix-lignende system?
Det er det mest almindelige spørgsmål, der stilles af nye sysadmins eller Linux/UNIX-brugere. Debugging af shell-scripts kan være en kedelig opgave (læs som ikke let). Der er forskellige måder at debugge et shell-script på.
Du skal give argumentet -x eller -v til bash-shell for at gå igennem hver linje i scriptet.
Lad os se, hvordan du debugger et bash-script, der kører på Linux og Unix, ved hjælp af forskellige metoder.
-x mulighed for at debugge et bash-shell-script
Kør et shell-script med -x mulighed.$ bash -x script-name
$ bash -x domains.sh
Brug af den indbyggede set-kommando
Bash-shell tilbyder debugging-muligheder, som kan slås til eller fra ved hjælp af set-kommandoen:
- set -x : Viser kommandoer og deres argumenter, efterhånden som de udføres.
- set -v : Viser shell-indtastningslinjer, mens de læses.
Du kan bruge ovenstående to kommandoer i selve shellscriptet:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Du kan erstatte standard Shebang-linjen:#!/bin/bash
med følgende (til debugging) kode:#!/bin/bash -xv
Brug af intelligent DEBUG-funktion
Først skal du tilføje en særlig variabel kaldet _DEBUG. Sæt _DEBUG til ‘on’, når du skal debugge et script:_DEBUG="on"
Sæt følgende funktion i begyndelsen af scriptet:
function DEBUG(){ && $@}
Nu, hvor du har brug for debugging, skal du blot bruge DEBUG-funktionen på følgende måde:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Når du er færdig med debugging (og før du overfører dit script til produktion), skal du sætte _DEBUG til “off”. Det er ikke nødvendigt at slette debug-linjer._DEBUG="off" # set to anything but not to 'on'
Stikprøvescript:
#!/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"
Spar og luk filen. Kør scriptet som følger:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Sæt nu DEBUG til off (du skal redigere filen):_DEBUG="off"
Kør scriptet:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
Ovenstående er en simpel, men ret effektiv teknik. Du kan også prøve at bruge DEBUG som et alias i stedet for funktion.
Debugging Common Bash Shell Scripting Errors
Bash eller sh eller ksh giver forskellige fejlmeddelelser på skærmen, og i mange tilfælde giver fejlmeddelelsen måske ikke detaljerede oplysninger.
Skipper at anvende eksekveringstilladelse på filen
Når du skriver dit første hello world bash-shell-script, kan du ende med at få en fejl, der lyder som følger:bash: ./hello.sh: Permission denied
Sæt tilladelse ved hjælp af chmod-kommandoen:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
End of file unexpected Error
Hvis du får en uventet fejlmeddelelse om end of file, skal du åbne din scriptfil og sørge for, at den har både åbne og lukkede anførselstegn. I dette eksempel har echo-sætningen et åbnende citationstegn, men ingen lukkende citationstegn:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Sørg også for at kontrollere, om der mangler parenteser og parenteser ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Manglende nøgleord som fi, esac, ;;, osv.
Hvis du har glemt afsluttende nøgleord som fi eller ;;, får du en fejl som “xxx unexpected”. Så sørg for, at alle nestede if- og case-udsagn slutter med de rigtige nøgleord. Se bash man-siden for syntaksforskrifter. I dette eksempel mangler fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Flyt eller rediger shell-script på Windows- eller Unix-bokse
Lad være med at oprette scriptet på Linux/Unix og flyt det til Windows. Et andet problem er redigering af bash-shell-scriptet på Windows 10 og flyt/upload til Unix-server. Det vil resultere i en fejl som kommando ikke fundet på grund af vogn retur (DOS CR-LF). Du kan konvertere DOS newlines CR-LF til Unix/Linux-format ved hjælp af følgende syntaks:dos2unix my-script.sh
Tip 1 – Send debugmeddelelse til stderr
Standardfejl er standardfejludgangenheden, som bruges til at skrive alle systemfejlmeddelelser. Så det er en god idé at sende meddelelser til standardfejl-enheden:
# 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
Tip 2 – Slå syntaksfremhævning til, når du bruger vim-teksteditor
De fleste moderne tekstredigeringsprogrammer giver dig mulighed for at indstille syntaksfremhævningsindstillingen. Dette er nyttigt for at opdage syntaks og forhindre almindelige fejl som f.eks. åbne eller lukke citationstegn. Du kan se bash script i forskellige farver. Denne funktion letter skrivning i en shell script strukturer og syntaksfejl er visuelt tydelige. Fremhævning påvirker ikke selve tekstens betydning; det er kun lavet for dig. I dette eksempel bruges vim syntaksfremhævning til mit bash-script:
Fig.01: Syntaksfremhævning af Bash-shell-script ved hjælp af vim teksteditor
Tip 3 – Brug shellcheck til at lint script
ShellCheck er et statisk analyseværktøj til shell-scripts. Man kan bruge det til at finde fejl i dine shell scripts. Det er skrevet i Haskell. Du kan finde advarsler og forslag til bash/sh-shell scripts med dette værktøj. Lad os se, hvordan du installerer og bruger ShellCheck på et Linux- eller Unix-lignende system for at forbedre dine shell-scripts, undgå fejl og øge produktiviteten.
Se også:
- Se, hvordan du slår syntaksmarkering til under vim-teksteditor.
- Bash man page
- BASH med debugger og forbedret understøttelse af fejlfinding og fejlhåndtering
🐧 24 kommentarer indtil videre… tilføj en ↓
Kategori | Liste over Unix- og Linux-kommandoer | |
---|---|---|
Fil Management | cat | |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 | |
Netværkstjenester | dig – host – ip – nmap | |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 | |
Package Manager | apk – apt | |
Processes Management | bg – chroot – cron – disown – fg – jobs – killall – kill – kill – pidof – pstree – pwdx – time | |
Searching | grep – whereis – which | |
User Information | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w | |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |