Cum să depanăm un script Bash Shell sub Linux sau UNIX
Din poșta mea:
Am scris un mic script hello world. Cum pot depana un script bash shell care rulează pe un sistem de tip Linux sau Unix?
Este cea mai frecventă întrebare pusă de noii sysadmins sau de utilizatorii Linux/UNIX. Depanarea scripturilor shell poate fi o treabă plictisitoare (a se citi că nu este ușoară). Există diverse moduri de a depana un script shell.
Trebuie să treceți argumentul -x sau -v la shell-ul bash pentru a parcurge fiecare linie din script.
Să vedem cum să depanăm un script bash care rulează pe Linux și Unix folosind diverse metode.
opțiunea x pentru a depana un script shell bash
Executați un script shell cu opțiunea -x.$ bash -x script-name
$ bash -x domains.sh
Utilizarea comenzii set builtin
Bash shell oferă opțiuni de depanare care pot fi activate sau dezactivate cu ajutorul comenzii set:
- set -x : Afișează comenzile și argumentele lor pe măsură ce sunt executate.
- set -v : Afișează liniile de intrare în shell pe măsură ce sunt citite.
Puteți utiliza cele două comenzi de mai sus chiar în scriptul shell:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Puteți înlocui linia Shebang standard:#!/bin/bash
cu următorul cod (pentru depanare):#!/bin/bash -xv
Utilizarea funcției inteligente DEBUG
În primul rând, adăugați o variabilă specială numită _DEBUG. Setați _DEBUG la „on” atunci când aveți nevoie să depanați un script:_DEBUG="on"
Puneți următoarea funcție la începutul scriptului:
function DEBUG(){ && $@}
Acum, ori de câte ori aveți nevoie de depanare, pur și simplu folosiți funcția DEBUG după cum urmează:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
După ce ați terminat cu depanarea (și înainte de a muta scriptul în producție) setați _DEBUG la „off”. Nu este nevoie să ștergeți liniile de depanare. _DEBUG="off" # set to anything but not to 'on'
Semplu de script:
#!/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"
Salvați și închideți fișierul. Rulați scriptul după cum urmează:$ ./script.sh
Output:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Acum setați DEBUG la off (trebuie să editați fișierul):_DEBUG="off"
Rulați scriptul:$ ./script.sh
Output:
Found in xyz.txt file2 + 3 = 5
Cel de mai sus este o tehnică simplă, dar destul de eficientă. Puteți încerca, de asemenea, să folosiți DEBUG ca alias în loc de funcție.
Debugging Common Bash Shell Scripting Errors
Bash sau sh sau ksh oferă diverse mesaje de eroare pe ecran și în multe cazuri mesajul de eroare poate să nu ofere informații detaliate.
Să aplicați permisiunea de execuție asupra fișierului
Când scrieți primul dvs. script shell bash hello world, s-ar putea să ajungeți să primiți o eroare care se citește după cum urmează:bash: ./hello.sh: Permission denied
Setați permisiunea folosind comanda chmod:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Erroră de sfârșit de fișier neașteptată
Dacă primiți un mesaj de eroare de sfârșit de fișier neașteptat, deschideți fișierul script și și asigurați-vă că are atât ghilimele de deschidere cât și de închidere. În acest exemplu, instrucțiunea echo are un ghilimele de deschidere, dar nu are ghilimele de închidere:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
De asemenea, asigurați-vă că ați verificat dacă lipsesc parantezele și parantezele ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Cuvinte cheie lipsă, cum ar fi fi, esac, ;;, etc.
Dacă ați omis cuvinte cheie finale precum fi sau ;;; veți primi o eroare de genul „xxx unexpected”. Așadar, asigurați-vă că toate instrucțiunile if și case imbricate se termină cu cuvintele cheie corespunzătoare. Consultați pagina de manual bash pentru cerințele de sintaxă. În acest exemplu, lipsește fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Mutarea sau editarea scriptului shell pe cutii Windows sau Unix
Nu creați scriptul pe Linux/Unix și nu îl mutați pe Windows. O altă problemă este editarea scriptului shell bash pe Windows 10 și mutarea/încărcarea pe serverul Unix. Va rezulta o eroare de genul comanda nu a fost găsită din cauza revenirii la cărămidă (DOS CR-LF). Puteți converti DOS newlines CR-LF în formatul Unix/Linux folosind următoarea sintaxă:dos2unix my-script.sh
Tip 1 – Send Debug Message To stderr
Standard error este dispozitivul implicit de ieșire a erorilor, care este utilizat pentru a scrie toate mesajele de eroare de sistem. Așadar, este o idee bună să trimiteți mesaje către dispozitivul de eroare implicit:
# 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 – Activați evidențierea sintaxei atunci când utilizați editorul de text vim
Majoritatea editorilor de text moderni vă permit să setați opțiunea de evidențiere a sintaxei. Acest lucru este util pentru a detecta sintaxa și pentru a preveni erori comune, cum ar fi deschiderea sau închiderea ghilimelelor. Puteți vedea scriptul bash în culori diferite. Această caracteristică ușurează scrierea în structurile unui script shell, iar erorile de sintaxă sunt distincte din punct de vedere vizual. Evidențierea nu afectează semnificația textului în sine; este făcută doar pentru dumneavoastră. În acest exemplu, evidențierea sintaxei vim este folosită pentru scriptul meu bash:
Fig.01: Evidențierea sintaxei scriptului shell Bash folosind editorul de text vim
Tip 3 – Folosiți shellcheck pentru a lint scriptul
ShellCheck este un instrument de analiză statică pentru scripturile shell. Se poate folosi pentru a găsi bug-uri în scripturile shell. Este scris în Haskell. Puteți găsi avertismente și sugestii pentru scripturile shell bash/sh cu acest instrument. Să vedem cum se instalează și se utilizează ShellCheck pe un sistem Linux sau de tip Unix pentru a vă îmbunătăți scripturile shell, pentru a evita erorile și pentru productivitate.
Vezi și:
- Vezi cum se activează evidențierea sintaxei sub editorul de text vim.
- Bash man page
- BASH cu Debugger și suport îmbunătățit pentru depanare și gestionarea erorilor
🐧 24 comentarii până acum… add one ↓
Categorie | Listă de comenzi Unix și Linux |
---|---|
File Management | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.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 |
Manager de pachete | apk – apt |
Managementul proceselor | 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 – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |