Hoe kan ik een Bash Shell Script onder Linux of UNIX debuggen?
Vanuit mijn postzak:
Ik heb een klein hello world script geschreven. Hoe kan ik een bash shell script debuggen op een Linux of Unix systeem?
Het is de meest gestelde vraag door nieuwe sysadmins of Linux/UNIX gebruikers. Shell scripting debuggen kan een vervelende klus zijn (lees als niet gemakkelijk). Er zijn verschillende manieren om een shellscript te debuggen.
U moet het -x of -v argument aan bash shell doorgeven om door elke regel in het script te lopen.
Laten we eens kijken hoe we een bash script dat op Linux en Unix draait met verschillende methoden kunnen debuggen.
-x optie om een bash shell script te debuggen
Run een shell script met -x optie.$ bash -x script-name
$ bash -x domains.sh
Gebruik van set builtin commando
Bash shell biedt debug opties die kunnen worden aan- of uitgezet met het set commando:
- set -x : Geef commando’s en hun argumenten weer terwijl ze worden uitgevoerd.
- set -v : Toon shell invoerregels terwijl ze worden gelezen.
U kunt de bovenstaande twee commando’s in het shellscript zelf gebruiken:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
U kunt de standaard Shebang-regel vervangen door:#!/bin/bash
door de volgende (voor debugging bedoelde) code:#!/bin/bash -xv
Gebruik van intelligente DEBUG-functie
Voeg eerst een speciale variabele toe, _DEBUG genaamd. Zet _DEBUG op ‘on’ wanneer u een script moet debuggen:_DEBUG="on"
Plaats de volgende functie aan het begin van het script:
function DEBUG(){ && $@}
Nu gebruikt u overal waar u debugging nodig hebt gewoon de DEBUG-functie op de volgende manier:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Wanneer u klaar bent met debuggen (en voordat u uw script naar productie verplaatst), zet u _DEBUG op ‘off’. U hoeft geen debugregels te verwijderen._DEBUG="off" # set to anything but not to 'on'
Samplescript:
#!/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"
Bewaar en sluit het bestand. Voer het script als volgt uit:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Nu DEBUG op uit zetten (u moet het bestand bewerken):_DEBUG="off"
Run script:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
Hierboven staat een eenvoudige maar vrij effectieve techniek. U kunt ook proberen om DEBUG te gebruiken als een alias in plaats van function.
Debugging Common Bash Shell Scripting Errors
Bash of sh of ksh geeft verschillende foutmeldingen op het scherm en in veel gevallen kan de foutmelding geen gedetailleerde informatie geven.
Schieten om toestemming voor execute toe te passen op het bestand
Wanneer u uw eerste hello world bash shell script schrijft, krijgt u misschien een foutmelding die als volgt luidt:bash: ./hello.sh: Permission denied
Toestemming instellen met chmod commando:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Einde van bestand onverwachte fout
Als u een onverwachte foutmelding Einde van bestand krijgt, opent u uw scriptbestand en controleert u of het zowel open- als sluitingsaanhalingstekens heeft. In dit voorbeeld heeft de echo-opdracht wel een openend aanhalingsteken, maar geen sluitend aanhalingsteken:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Controleer ook of er geen haakjes en accolades ({}) ontbreken:
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Ontbrekende trefwoorden zoals fi, esac, ;;, enz.
Als u een eindkeyword zoals fi of ;; mist, krijgt u een foutmelding zoals “xxx unexpected”. Dus zorg ervoor dat alle geneste if en case statements eindigen met de juiste sleutelwoorden. Zie bash man page voor de syntax vereisten. In dit voorbeeld ontbreekt fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Het verplaatsen of bewerken van shell script op Windows of Unix boxen
Maak het script niet op Linux/Unix en verplaats het naar Windows. Een ander probleem is het bewerken van het bash shell script op Windows 10 en verplaatsen/uploaden naar Unix server. Het zal resulteren in een fout zoals commando niet gevonden als gevolg van de carriage return (DOS CR-LF). U kunt DOS newlines CR-LF converteren naar Unix/Linux formaat met behulp van de volgende syntaxis:dos2unix my-script.sh
Tip 1 – Debug Message To stderr
Standard error is het standaard foutuitvoerapparaat, dat wordt gebruikt om alle systeemfoutmeldingen te schrijven. Het is dus een goed idee om berichten naar het standaard foutapparaat te sturen:
# 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 – Zet syntax highlighting aan bij gebruik van vim teksteditor
Met de meeste moderne teksteditors kunt u de optie syntax highlighting instellen. Dit is handig om syntaxis te detecteren en veelvoorkomende fouten te voorkomen, zoals het openen of sluiten van aanhalingstekens. Je kunt bash script in verschillende kleuren zien. Deze functie vergemakkelijkt het schrijven in een shell script structuren en syntaxis fouten zijn visueel duidelijk. Highlighting heeft geen invloed op de betekenis van de tekst zelf; het is alleen voor jou gemaakt. In dit voorbeeld wordt vim syntax highlighting gebruikt voor mijn bash script:
Fig.01: Bash shell script syntax highlighting using vim text editor
Tip 3 – Use shellcheck to lint script
ShellCheck is een statische analysetool voor shell scripts. Je kunt het gebruiken om bugs in je shell scripts te vinden. Het is geschreven in Haskell. Je kunt waarschuwingen en suggesties voor bash/sh shell scripts vinden met deze tool. Laten we eens kijken hoe je ShellCheck kunt installeren en gebruiken op een Linux of Unix-achtig systeem om je shell scripts te verbeteren, fouten te voorkomen en je productiviteit te verhogen.
Zie ook:
- Zie hoe je syntax highlighting kunt inschakelen onder vim tekst editor.
- Bash man page
- BASH met Debugger en verbeterde Debug-ondersteuning en Foutafhandeling
🐧 24 reacties tot nu toe… een toevoegen ↪Sm_4869>
Categorie | Lijst van Unix en Linux commando’s |
---|---|
Bestand Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Network Utilities | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Package Manager | apk – apt |
Processen Beheer | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
Searching | grep – whereis – which |
User Information | groups – id – lastcomm – last – lid/libuser-lid – lognaam – leden – gebruikers – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |