Jak zdebugować skrypt powłoki Bash pod Linuksem lub UNIXem
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.
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"
ORDEBUG 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:
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
🐧 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 |