Hur man felsöker ett Bash Shell-skript under Linux eller UNIX
Från min brevlåda:
Jag skrev ett litet hello world-skript. Hur kan jag felsöka ett bash-shellskript som körs på ett Linux- eller Unixliknande system?
Det är den vanligaste frågan som ställs av nya sysadmins eller Linux/UNIX-användare. Debugging av skalskript kan vara ett tråkigt jobb (läs: inte lätt). Det finns olika sätt att felsöka ett skalskript.
Du måste skicka argumentet -x eller -v till bash-skalet för att gå igenom varje rad i skriptet.
Låt oss se hur man kan felsöka ett bash-skript som körs på Linux och Unix med olika metoder.
-x-alternativet för att felsöka ett bash-skalskript
Kör ett skalskript med -x-alternativet.$ bash -x script-name
$ bash -x domains.sh
Användning av det inbyggda set-kommandot
Bash-skalet erbjuder felsökningsalternativ som kan slås på eller stängas av med hjälp av set-kommandot:
- set -x : Visar kommandon och deras argument när de utförs.
- set -v : Visa skalets inmatningsrader när de läses.
Du kan använda ovanstående två kommandon i själva skalskriptet:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Du kan ersätta den vanliga Shebang-linjen:#!/bin/bash
med följande kod (för felsökning):#!/bin/bash -xv
Användning av den intelligenta DEBUG-funktionen
Först lägger du till en speciell variabel som heter _DEBUG. Sätt _DEBUG till ”on” när du behöver felsöka ett skript:_DEBUG="on"
Sätt följande funktion i början av skriptet:
function DEBUG(){ && $@}
Nu, närhelst du behöver felsökning, använder du helt enkelt funktionen DEBUG på följande sätt:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
När du är klar med felsökningen (och innan du flyttar skriptet till produktion) sätter du _DEBUG till ”off”. Du behöver inte ta bort felsökningsrader._DEBUG="off" # set to anything but not to 'on'
Exempel på skript:
#!/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"
Spara och stäng filen. Kör skriptet på följande sätt:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Sätt nu DEBUG på off (du måste redigera filen):_DEBUG="off"
Kör skriptet:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
Ovanstående är en enkel men ganska effektiv teknik. Du kan också försöka använda DEBUG som alias i stället för function.
Debugging Common Bash Shell Scripting Errors
Bash eller sh eller ksh ger olika felmeddelanden på skärmen och i många fall ger felmeddelandet ingen detaljerad information.
Skippar att tillämpa exekveringsbehörighet på filen
När du skriver ditt första hello world bash-shellskript kan det hända att du får ett fel som ser ut på följande sätt:bash: ./hello.sh: Permission denied
Sätt behörighet med hjälp av chmod-kommandot:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Oväntat fel vid filens slut
Om du får ett oväntat felmeddelande vid filens slut öppnar du skriptfilen och kontrollerar att den har både öppnande och stängande citattecken. I det här exemplet har echo-satsen ett öppnande citationstecken men inget avslutande citationstecken:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Kontrollera också om det saknas parenteser och hängslen ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Saknas nyckelord som fi, esac, ;;, etc.
Om du missar avslutande nyckelord som fi eller ;; får du ett fel som ”xxx unexpected”. Se därför till att alla inbäddade if- och case-satser avslutas med rätt nyckelord. Se bash man page för syntaxkrav. I det här exemplet saknas fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Förflyttning eller redigering av skalskript på Windows- eller Unix-boxar
Skapa inte skriptet på Linux/Unix och flytta det till Windows. Ett annat problem är att redigera bash-skalskriptet på Windows 10 och flytta/ladda upp det till Unix-servern. Det kommer att resultera i ett fel som att kommandot inte hittas på grund av vagnreturen (DOS CR-LF). Du kan konvertera DOS newlines CR-LF till Unix/Linux-format med hjälp av följande syntax:dos2unix my-script.sh
Tip 1 – Skicka felsökningsmeddelande till stderr
Standardfel är standardfelutgångenheten, som används för att skriva alla systemfelmeddelanden. Så det är en bra idé att skicka meddelanden till standardfelenheten:
# 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å på syntaxmarkering när du använder vim textredigerare
De flesta moderna textredigerare låter dig ställa in alternativet syntaxmarkering. Detta är användbart för att upptäcka syntax och förhindra vanliga fel som öppnande eller stängande citationstecken. Du kan se bash-skript i olika färger. Den här funktionen underlättar skrivandet i ett skalskript strukturer och syntaxfel är visuellt distinkta. Markering påverkar inte innebörden av själva texten, den är gjord endast för dig. I det här exemplet används vim syntaxmarkering för mitt bash-skript:
Fig.01: Syntaxmarkering av ett Bash-skalskripts syntaxmarkering med hjälp av vim-textredigeraren
Tip 3 – Använd shellcheck för att felsöka skriptet
ShellCheck är ett statiskt analysverktyg för skalskript. Man kan använda det för att hitta fel i sina skalskript. Det är skrivet i Haskell. Du kan hitta varningar och förslag för bash/sh-skalskript med det här verktyget. Låt oss se hur man installerar och använder ShellCheck på ett Linux- eller Unix-liknande system för att förbättra dina skalskript, undvika fel och öka produktiviteten.
Se även:
- Se hur man aktiverar syntaxmarkering under vim-texteditorn.
- Bash man page
- BASH with Debugger and Improved Debug Support and Error Handling
🐧 24 kommentarer hittills… lägg till en ↓
Kategori | Lista över Unix- och Linuxkommandon |
---|---|
Fil Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Nätverksverktyg | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Package Manager | apk – apt |
Processhantering | bg – chroot – cron – disown – fg – jobs – killall – kill – kill – pidof – pstree – pwdx – time |
Sökning | grep – whereis – which |
Användarinformation | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |