Jak zdebugować skrypt powłoki Bash pod Linuksem lub UNIXem

paź 6, 2021
admin

Z mojej skrzynki pocztowej:
Pisałem mały skrypt hello world. Jak mogę debugować skrypty powłoki bash działające w systemach Linux lub Unix?
Jest to najczęstsze pytanie zadawane przez nowych sysadminów lub użytkowników Linuxa/UNIXa. Debugowanie skryptów powłoki może być żmudną pracą (czytaj niełatwą). Istnieją różne sposoby debugowania skryptu powłoki.
Musisz przekazać argument -x lub -v do powłoki bash, aby przejść przez każdy wiersz skryptu.
Jak debugować skrypt powłoki bash na Linuksie lub Uniksie
Zobaczmy, jak debugować skrypt bash działający na Linuksie i Uniksie przy użyciu różnych metod.

-x opcja do debugowania skryptu powłoki bash

Uruchom skrypt powłoki z opcją -x.
$ bash -x script-name
$ bash -x domains.sh

Użycie wbudowanego polecenia set

Powłoka bash oferuje opcje debugowania, które można włączyć lub wyłączyć za pomocą polecenia set:

  • set -x : Wyświetla polecenia i ich argumenty w trakcie wykonywania.
  • set -v : Wyświetla wiersze wejściowe powłoki w trakcie ich odczytywania.

Możesz użyć powyższych dwóch poleceń w samym skrypcie powłoki:

#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands

Możesz zastąpić standardową linię Shebang:
#!/bin/bash
na następujący (do debugowania) kod:
#!/bin/bash -xv

Użycie inteligentnej funkcji DEBUG

Po pierwsze, dodaj specjalną zmienną o nazwie _DEBUG. Ustaw _DEBUG na 'on’, gdy potrzebujesz debugować skrypt:
_DEBUG="on"

Na początku skryptu umieść następującą funkcję:

function DEBUG(){ && $@}

Teraz wszędzie, gdzie potrzebujesz debugowania, po prostu użyj funkcji DEBUG w następujący sposób:
DEBUG echo "File is $filename"
OR
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x

Po zakończeniu debugowania (i przed przeniesieniem skryptu na produkcję) ustaw _DEBUG na 'off’. Nie ma potrzeby usuwania linii debugowania.
_DEBUG="off" # set to anything but not to 'on'

Przykładowy skrypt:

#!/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"

Zapisz i zamknij plik. Uruchom skrypt w następujący sposób:
$ ./script.sh
Output:

Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5

Teraz ustaw DEBUG na off (musisz edytować plik):
_DEBUG="off"
Run script:
$ ./script.sh
Output:

Found in xyz.txt file2 + 3 = 5

Powyżej przedstawiona jest prosta, ale dość skuteczna technika. Możesz również spróbować użyć DEBUG jako aliasu zamiast funkcji.

Debugowanie typowych błędów skryptów powłoki Bash

Bash lub sh lub ksh daje różne komunikaty o błędach na ekranie i w wielu przypadkach komunikat o błędzie może nie dostarczać szczegółowych informacji.

Przeskoczenie do zastosowania uprawnienia execute na pliku

Gdy piszesz swój pierwszy skrypt powłoki bash hello world, możesz w końcu otrzymać błąd, który brzmi następująco:
bash: ./hello.sh: Permission denied
Ustaw uprawnienia używając polecenia chmod:
$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh

Koniec pliku nieoczekiwany błąd

Jeśli otrzymujesz komunikat o nieoczekiwanym końcu pliku, otwórz swój plik skryptu i upewnij się, że ma on zarówno cudzysłów otwierający, jak i zamykający. W tym przykładzie instrukcja echo ma cudzysłów otwierający, ale nie ma cudzysłowu zamykającego:

#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote

Upewnij się również, że nie ma brakujących nawiasów i klamer ({}):

#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...

Missing Keywords Such As fi, esac, ;;, etc.

Jeśli pominiesz kończące słowo kluczowe takie jak fi lub ;; otrzymasz błąd taki jak „xxx unexpected”. Upewnij się więc, że wszystkie zagnieżdżone instrukcje if i case kończą się odpowiednimi słowami kluczowymi. Zobacz stronę podręcznika bash man dla wymagań składni. W tym przykładzie brakuje fi:

#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing

Przenoszenie lub edycja skryptu powłoki na skrzynkach Windows lub Unix

Nie należy tworzyć skryptu na Linuksie/Uniksie i przenosić do Windows. Innym problemem jest edycja skryptu powłoki bash na Windows 10 i przeniesienie / załadowanie go na serwer Unix. Spowoduje to błąd taki jak polecenie nie znaleziono z powodu powrotu karetki (DOS CR-LF). Możesz przekonwertować DOS newlines CR-LF do formatu Unix/Linux za pomocą następującej składni:
dos2unix my-script.sh

Tip 1 – Wyślij wiadomość Debug do stderr

Błąd standardowy jest domyślnym urządzeniem wyjściowym błędu, który jest używany do pisania wszystkich komunikatów o błędach systemowych. Dlatego dobrym pomysłem jest wysyłanie komunikatów do domyślnego urządzenia błędów:

# 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

Porada 2 – Włącz podświetlanie składni podczas używania edytora tekstu vim

Większość nowoczesnych edytorów tekstu pozwala na ustawienie opcji podświetlania składni. Jest to przydatne do wykrywania składni i zapobiegania typowym błędom, takim jak otwieranie lub zamykanie cytatów. Możesz zobaczyć skrypt basha w różnych kolorach. Funkcja ta ułatwia pisanie w skryptach powłoki, a błędy składni są wizualnie wyróżnione. Podświetlanie nie ma wpływu na znaczenie samego tekstu; jest zrobione tylko dla Ciebie. W tym przykładzie, podświetlanie składni w vim jest używane dla mojego skryptu bash:

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

Fig.01: Podświetlanie składni skryptu powłoki Bash przy użyciu edytora tekstu vim

Wskazówka 3 – Użyj shellcheck do podlinkowywania skryptu

ShellCheck jest narzędziem analizy statycznej dla skryptów powłoki. Można go użyć do znalezienia błędów w skryptach powłoki. Jest napisane w Haskellu. Możesz znaleźć ostrzeżenia i sugestie dla skryptów powłoki bash/sh za pomocą tego narzędzia. Zobaczmy, jak zainstalować i używać ShellCheck w systemie Linux lub Unix-like, aby ulepszyć twoje skrypty powłoki, uniknąć błędów i zwiększyć wydajność.

Zobacz także:

  • Zobacz, jak włączyć kolorowanie składni w edytorze tekstu vim.
  • Bash man page
  • BASH with Debugger and Improved Debug Support and Error Handling

🐧 Otrzymuj najnowsze tutoriale na temat Linuksa, Open Source & DevOps poprzez kanał RSS lub cotygodniowy biuletyn e-mail.
🐧 24 komentarze do tej pory… dodaj jeden ↓
Kategoria Lista poleceń systemu Unix i Linux
Plik. Zarządzanie 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
Processes Management 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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.