Hogyan hibakeresés egy Bash Shell script Linux vagy UNIX alatt

okt 6, 2021
admin

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.
Hogyan hibakereshetünk egy bash shell szkriptet Linuxon vagy Unixon
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"
OR
DEBUG 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:

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

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

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.
🐧 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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.