Hogyan hibakeresés egy Bash Shell script Linux vagy UNIX alatt
A mailbagemből:
Egy kis hello world scriptet írtam. Hogyan tudok hibakeresést végezni egy Linux vagy Unix-szerű rendszereken futó bash shell szkriptben?
Ez a leggyakoribb kérdés, amit új rendszergazdák vagy Linux/UNIX felhasználók tesznek fel. A shell szkriptek hibakeresése fárasztó (értsd: nem könnyű) munka lehet. A shell szkriptek hibakeresésének különböző módjai vannak.
A bash shell-nek át kell adnia a -x vagy -v argumentumot, hogy végigmehessen a szkript minden egyes során.
Lássuk, hogyan hibakereshetünk egy Linuxon és Unixon futó bash szkriptet különböző módszerekkel.
-x opció egy bash shell script hibakereséséhez
Futtasson egy shell scriptet a -x opcióval.$ bash -x script-name
$ bash -x domains.sh
A set beépített parancs használata
A bash shell kínál hibakeresési opciókat, amelyeket a set paranccsal kapcsolhat be vagy ki:
- set -x : A parancsok és argumentumaik megjelenítése végrehajtásuk közben.
- set -v : A shell bemeneti sorainak megjelenítése olvasás közben.
A fenti két parancsot magában a shell scriptben is használhatja:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
A standard Shebang sort helyettesítheti:#!/bin/bash
a következő (hibakeresésre szolgáló) kóddal:#!/bin/bash -xv
Az intelligens DEBUG függvény használata
Először is adjunk hozzá egy speciális változót _DEBUG néven. Állítsuk a _DEBUG-ot ‘on’-ra, ha hibakeresésre van szükségünk egy szkriptben:_DEBUG="on"
Tegyük a következő függvényt a szkript elejére:
function DEBUG(){ && $@}
Ezután bárhol, ahol hibakeresésre van szükségünk, egyszerűen használjuk a DEBUG függvényt az alábbiak szerint:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Amikor végeztünk a hibakereséssel (és mielőtt a szkriptet átvinnénk a termelésbe), állítsuk a _DEBUG-ot ‘off’-ra. Nem kell törölni a hibakeresési sorokat._DEBUG="off" # set to anything but not to 'on'
Mintaszkript:
#!/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"
Mentsd el és zárd be a fájlt. Futtassa a szkriptet a következőképpen:$ ./script.sh
Kimenet:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Most állítsa ki a DEBUG-ot (ehhez szerkesztenie kell a fájlt):_DEBUG="off"
Futtassa a szkriptet:$ ./script.sh
Kimenet:
Found in xyz.txt file2 + 3 = 5
A fenti egy egyszerű, de igen hatékony technika. Megpróbálhatja a DEBUG-ot is használni alias-ként a function helyett.
Debugging Common Bash Shell Scripting Errors
A Bash vagy sh vagy ksh különböző hibaüzeneteket ad a képernyőn, és sok esetben a hibaüzenet nem ad részletes információt.
Kihagyás, hogy execute engedélyt alkalmazzon a fájlra
Mikor megírja az első hello world bash shell szkriptjét, előfordulhat, hogy a következő hibaüzenetet kapja:bash: ./hello.sh: Permission denied
A jogosultság beállítása a chmod paranccsal:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
End of file unexpected Error
Ha egy End of file unexpected hibaüzenetet kap, nyissa meg a szkript fájlját, és győződjön meg róla, hogy nyitó és záró idézőjelek is vannak benne. Ebben a példában az echo utasításban van nyitó idézőjel, de nincs záró idézőjel:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Azt is ellenőrizze, hogy hiányoznak-e zárójelek és zárójelek ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Hiányzó kulcsszavak, mint például fi, esac, ;; stb.
Ha kihagyja az olyan befejező kulcsszavakat, mint a fi vagy ;;, akkor olyan hibaüzenetet kap, mint például “xxx váratlan”. Ezért győződjön meg róla, hogy minden egymásba ágyazott if és case utasítás megfelelő kulcsszóval végződik. A szintaxis követelményeit lásd a bash man oldalon. Ebben a példában a fi hiányzik:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Héjszkript áthelyezése vagy szerkesztése Windows vagy Unix dobozokon
Ne készítse a szkriptet Linuxon/Unixon, majd helyezze át Windowsra. Egy másik probléma a bash shell szkript szerkesztése Windows 10-en és áthelyezése/feltöltése Unix szerverre. Ez olyan hibát eredményez, mint a parancs nem található a kocsi visszatérés (DOS CR-LF) miatt. A DOS newlines CR-LF-et a következő szintaxissal alakíthatja át Unix/Linux formátumra:dos2unix my-script.sh
Tipp 1 – Debug Message Send To stderr
A standard error az alapértelmezett hibakimeneti eszköz, amely az összes rendszerhibaüzenet írására szolgál. Ezért érdemes az üzeneteket az alapértelmezett hibaeszközre küldeni:
# 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
Tipp 2 – Kapcsoljuk be a szintaxis kiemelést a vim szövegszerkesztő használatakor
A legtöbb modern szövegszerkesztő lehetővé teszi a szintaxis kiemelés beállítását. Ez hasznos a szintaxis felismeréséhez és az olyan gyakori hibák megelőzéséhez, mint a nyitó vagy záró idézőjel. A bash szkriptet különböző színekben láthatja. Ez a funkció megkönnyíti az írást egy shell script struktúrákban, és a szintaxis hibák vizuálisan megkülönböztethetők. A kiemelés nem befolyásolja magának a szövegnek a jelentését; ez csak az Ön számára készült. Ebben a példában a vim szintaxiskiemelést használom a bash-szkriptemhez:
Fig.01: Bash shell script syntax highlighting using vim text editor
Tip 3 – Use shellcheck to lint script
A ShellCheck egy statikus elemző eszköz shell-szkriptekhez. Használhatjuk arra, hogy hibákat találjunk a shell szkriptjeinkben. Haskell nyelven íródott. Ezzel az eszközzel bash/sh shell szkriptekhez találhatunk figyelmeztetéseket és javaslatokat. Lássuk, hogyan telepíthetjük és használhatjuk a ShellCheck-et egy Linux vagy Unix-szerű rendszeren a shell-szkriptek javítására, a hibák elkerülésére és a termelékenység növelésére.
See also:
- See how to turn on syntax highlighting under vim text editor.
- Bash man page
- BASH with Debugger and Improved Debug Support and Error Handling
🐧 Eddig 24 hozzászólás… add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Hálózati segédprogramok | 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 – pidof – pstree – pwdx – time |
Keresés | 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 |