Jak debugować skrypty bash

Jak debugować skrypty bash

Istnieją techniki z tradycyjnych środowisk programowych, które mogą pomóc.
Pomoże również niektóre podstawowe narzędzia, takie jak korzystanie z edytora z podświetleniem składni.
Istnieją wbudowane opcje, które Bash zapewnia, aby ułatwić debugowanie i codzienne zadanie administracji systemu Linux.

W tym artykule nauczysz się kilku przydatnych metod debugowania skryptów Bash:

  • Jak używać technik tradycyjnych
  • Jak korzystać z opcji XTRACE
  • Jak korzystać z innych opcji bash
  • Jak używać pułapki

Najbardziej skuteczne narzędzie do debugowania jest nadal uważne, w połączeniu z rozsądnie umieszczonymi wypowiedziami drukowania. - Brian Kernighan, „UNIX FORINTERS” (1979)

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Dowolna dystrybucja GNU/Linux
Oprogramowanie GNU Bash
Inny Nie dotyczy
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Przy użyciu tradycyjnych technik

Kod debugowania może być trudny, nawet jeśli błędy są proste i oczywiste. Programiści tradycyjnie skorzystali z narzędzi takich jak debuggery i podświetlanie składni u redaktorów, aby im pomóc. Nic inaczej jest pisanie skryptów bash. Samo podświetlenie składni pozwoli ci złapać błędy podczas pisania kodu, zapisywanie czasochłonnego zadania polegającego na śledzeniu błędów później.

Niektóre języki programowania są wyposażone w towarzyszące środowiska debugowania, takie jak GCC i GDB, które pozwalają przejść przez kod, ustawiać punkty przerwania, zbadać stan wszystkiego w tych punktach wykonania i nie tylko - ale na ogół jest mniej potrzeby takiego ciężkiego podejścia z takim ręką. Skrypty powłoki, ponieważ kod jest po prostu interpretowany zamiast kompilowania w pliki binarne.

Istnieją techniki stosowane w tradycyjnych środowiskach programowania, które mogą być przydatne w złożonych skryptach bash, takie jak używanie twierdzeń. Są to w zasadzie sposoby wyraźnego stwierdzenia warunków lub stanu rzeczy na czas. Twierdzenia mogą wskazać nawet najbardziej subtelne błędy. Mogą być zaimplementowane jako krótka funkcja, która pokazuje czas, numer linii i tym podobny lub coś takiego:

$ echo "function_name (): Wartość \\ $ var is $ var"

Jak używać opcji Bash Xtrace

Podczas pisania scenariuszy Shell logika programowania jest zwykle krótsza i często jest zawarta w jednym pliku. Jest więc kilka wbudowanych opcji debugowania, których możemy użyć, aby zobaczyć, co się dzieje. Pierwsza opcja, o której należy wspomnieć xtrace opcja. Można to zastosować do skryptu, wywołując Bash z -X przełącznik.

$ bash -x 


To informuje Bash, aby pokazał nam, jak wygląda każde stwierdzenie po ocenie, tuż przed jego wykonaniem. Wkrótce zobaczymy przykład tego w akcji, ale najpierw kontrastujmy -X z jego przeciwieństwem -v, który pokazuje każdą linię przed jej oceną zamiast po. Opcje można łączyć i za pomocą obu -X I -v Możesz zobaczyć, jak wyglądają stwierdzenia przed i po zmiennych podstawieniach.

Ustawienie X I v Opcje w wierszu poleceń

Zwróć uwagę, jak używanie -X I -v opcje razem pozwalają nam zobaczyć oryginalne instrukcja IF przed $ Użytkownik Zmienna jest rozszerzona dzięki -v opcja. Widzimy również na linii, zaczynając od znaku plus, jak wygląda stwierdzenie po podstawie Jeśli oświadczenie. W bardziej skomplikowanych przykładach może to być dość przydatne.

Jak korzystać z innych opcji bash

Opcje bash do debugowania są domyślnie wyłączone, ale kiedy zostaną włączone, używając polecenia Set, pozostają włączone, dopóki wyraźnie wyłączały. Jeśli nie jesteś pewien, które opcje są włączone, możesz zbadać $- zmienne, aby zobaczyć obecny stan wszystkich zmiennych.

$ echo $- himbhs $ set -xv && echo $- himvxbhs 

Istnieje kolejny przydatny przełącznik, którego możemy użyć, aby pomóc nam znaleźć zmienne odniesione bez ustawiania wartości. To jest -u przełączać się i tak jak -X I -v Można go również używać w wierszu poleceń, jak widzimy w poniższym przykładzie:

Ustawienie u opcja w wierszu poleceń

Omyłkowo przypisaliśmy wartość 7 do zmiennej o nazwie „Poziom”, a następnie próbowaliśmy powtórzyć zmienną o nazwie „wynik”, która po prostu nie spowodowała wydrukowania na ekranie. Absolutnie nie podano żadnych informacji o debugowaniu. Ustawianie naszego -u przełącznik pozwala nam zobaczyć konkretny komunikat o błędzie „Wynik: niezwiązana zmienna”, który dokładnie wskazuje, co poszło nie tak.

Możemy użyć tych opcji w krótkich skryptach Bash, aby przekazać nam informacje o debugowaniu, aby zidentyfikować problemy, które w innym przypadku nie uruchamiają informacji zwrotnej z interpretera Bash. Przejdźmy przez kilka przykładów.

#!/bin/bash read -p „ścieżka do dodania:„ $ ścieżka, jeśli [”$ ścieżka” = ”/home/mike/bin”]; Następnie echo $ ścieżka >> $ ścieżka echo „nowa ścieżka: $ ścieżka„ else echo ”nie zmodyfikował ścieżki” fi 
Kopiuj Za pomocą X Opcja podczas uruchamiania skryptu Bash

W powyższym przykładzie uruchamiamy skrypt addPath normalnie i po prostu nie modyfikuje naszego ŚCIEŻKA. Nie daje nam żadnych wskazówek, dlaczego lub wskazówki na popełnione błędy. Uruchamianie go ponownie za pomocą -X Opcja wyraźnie pokazuje nam, że lewa strona naszego porównania jest pusty ciąg. $ ścieżka jest pustym ciągiem, ponieważ przypadkowo umieszczamy znak dolara przed „ścieżką” w naszym instrukcji odczytu. Czasami patrzymy prosto na taki błąd i nie wygląda to źle, dopóki nie otrzymamy wskazówki i nie pomyślamy: „Dlaczego tak jest $ ścieżka Oceniono na pusty ciąg?"

Patrząc na następny przykład, nie otrzymujemy również żadnego wskazania błędu od interpretera. Dostarczamy tylko jedną wartość na linię zamiast dwóch. To nie jest błąd, który zatrzyma wykonywanie skryptu, więc zostaliśmy po prostu zastanawianie się, nie otrzymując żadnych wskazówek. Używając -u przełącz, natychmiast otrzymujemy powiadomienie, że nasza zmienna J nie jest związane z wartością. Więc są to oszczędzające w czasie rzeczywistym, kiedy popełniamy błędy, które nie powodują faktycznych błędów z punktu widzenia tłumacza Bash.

#!/bin/bash dla i in 1 2 3 do echo $ i $ j 
Kopiuj Za pomocą u Opcja uruchamiana skrypt z wiersza poleceń

Teraz z pewnością myślisz, że to brzmi dobrze, ale rzadko potrzebujemy pomocy w debugowaniu błędów popełnianych w jednym liniowcu na wierszu poleceń lub w krótkich skryptach. Zazwyczaj walczymy z debugowaniem, gdy mamy do czynienia z dłuższymi i bardziej skomplikowanymi skryptami, i rzadko musimy ustawić te opcje i pozostawić je ustawione podczas uruchamiania wielu skryptów. Ustawienie -XV Opcje, a następnie uruchomienie bardziej złożonego skryptu często dodają zamieszania, podwajając lub trzykrotne wygenerowane wyjście.

Na szczęście możemy użyć tych opcji w bardziej precyzyjny sposób, umieszczając je w naszych skryptach. Zamiast jawnie wywoływać powłokę bash z opcją z wiersza poleceń, możemy ustawić opcję, dodając ją do linii Shebang.

#!/bin/bash -x

To ustawi -X Opcja dla całego pliku lub do momentu, gdy nie będzie on niepośród wykonywania skryptu, umożliwiając po prostu uruchomienie skryptu, wpisując nazwę pliku zamiast przekazywać go do Bash jako parametr. Długie skrypt lub taki, który ma dużo wyjścia, nadal stanie się nieporęczny przy użyciu tej techniki, więc spójrzmy na bardziej szczegółowy sposób korzystania z opcji.



Aby uzyskać bardziej ukierunkowane podejście, otaczaj tylko podejrzane bloki kodu z żądanymi opcjami. Takie podejście jest świetne dla skryptów, które generują menu lub szczegółowe dane wyjściowe, i odbywa się je przy użyciu Set Słowo kluczowe z plus lub minus.

#!/bin/bash read -p „ścieżka do dodania:„ $ ścieżka set -xv if [„$ ścieżka” = ”/home/mike/bin”]; Następnie echo $ ścieżka >> $ ścieżka echo „nowa ścieżka: $ ścieżka„ else echo ”nie zmodyfikował ścieżki” Fi Set +XV 
Kopiuj Opcje pakowania wokół bloku kodu w skrypcie

Otaczaliśmy tylko bloki kodu, które podejrzewamy, aby zmniejszyć wyjście, co ułatwia nasze zadanie w procesie. Zauważ, że włączamy nasze opcje tylko dla bloku kodu zawierającego naszą instrukcję IF-Then-Else, a następnie wyłącz opcje na końcu bloku podejrzanego. Możemy włączyć i wyłączać te opcje wielokrotnie w jednym skrypcie, jeśli nie możemy zawęzić podejrzanych obszarów lub jeśli chcemy ocenić stan zmiennych w różnych punktach, gdy postępujemy przez skrypt. Nie ma potrzeby wyłączania opcji, jeśli chcemy, aby była kontynuowana przez resztę wykonania skryptu.

Ze względu na kompletność powinniśmy również wspomnieć, że są debuggerzy napisani przez strony trzecie, którzy pozwolą nam przejść przez wiersz wykonania kodu według wiersza. Możesz chcieć zbadać te narzędzia, ale większość ludzi uważa, że ​​tak naprawdę nie są potrzebne.

Jak sugerują doświadczeni programiści, jeśli twój kod jest zbyt złożony, aby izolować podejrzane bloki z tymi opcjami, prawdziwym problemem jest to, że kod powinien zostać przeniesiony. Nadmiernie złożony kod oznacza, że ​​błędy mogą być trudne do wykrycia, a konserwacja może być czasochłonna i kosztowna.

Ostatnią rzeczą, o której należy wspomnieć o opcjach debugowania BASH, jest to, że istnieje również opcja globania plików -F. Ustawienie tej opcji wyłączy globbing (rozszerzenie wieloznacznych kart w celu generowania nazw plików), gdy jest włączona. Ten -F opcją może być przełącznik używany w wierszu poleceń z bash, po shebang w pliku lub, jak w tym przykładzie, aby otaczać blok kodu.

#!/bin/bash echo "ignoruj ​​opcję plikuglobbing wyłączoną" ls * echo "ignoruj ​​opcję globbing plików 
Kopiuj Za pomocą F opcja wyłączenia globbingu plików

Jak używać pułapki, aby pomóc w debugowaniu

Istnieją bardziej zaangażowane techniki, które warto rozważyć, czy Twoje skomplikowane są skomplikowane, w tym przy użyciu funkcji Assert, jak wspomniano wcześniej. Jedną z takich metod, o której należy pamiętać, jest użycie pułapki. Skrypty powłoki pozwalają nam zatrzymać sygnały i zrobić coś w tym momencie.

Prostym, ale przydatnym przykładem, którego możesz użyć w swoich skryptach Bash WYJŚCIE.

#!/BIN/BASH TRAP 'ECO Ocena to $ wynik, status to $ status' wyjście, jeśli [-z $ $]; Następnie status = "domyślny" Else Status = 1 $ Fi Score = 0, jeśli [$ user = 'superman']; Następnie wynik = 99 Elif [$# -GT 1]; Następnie wynik = 2 $ fi 
Kopiuj Za pomocą pułapki WYJŚCIE Aby pomóc w debugowaniu skryptu

Jak widać, po prostu zrzucanie bieżących wartości zmiennych na ekran może być przydatne, aby pokazać, gdzie logika zawodzi. WYJŚCIE Sygnał oczywiście nie wymaga wyraźnego Wyjście stwierdzenie do wygenerowania; W tym przypadku Echo Instrukcja jest wykonywana po osiągnięciu końca skryptu.

Kolejną przydatną pułapką do użycia ze skryptami Bash jest ODPLUSKWIĆ. Dzieje się tak po każdym stwierdzeniu, dzięki czemu można go użyć jako brutalnej siły, aby pokazać wartości zmiennych na każdym etapie wykonania skryptu.

#!/bin/bash pułapka „echo” linia $ lineno: wynik to $ wynik ”'' wynik debugowania = 0, jeśli [" $ user "=" Mike "]; Następnie niech „wynik += 1” FI LET ”SCORT += 1" IF ["$ 1" = "7"]; Następnie wynik = 7 Fi Exit 0 
Kopiuj Za pomocą pułapki ODPLUSKWIĆ Aby pomóc w debugowaniu skryptu

Wniosek

Kiedy zauważysz, że skrypt bash nie zachowuje się zgodnie z oczekiwaniami, a powód nie jest dla ciebie jasny z jakiegokolwiek powodu, zastanów się, jakie informacje byłyby przydatne, aby pomóc Ci zidentyfikować przyczynę, a następnie użyj dostępnych najbardziej wygodnych narzędzi, aby pomóc Ci wskazać problem. Opcja XTRACE -X jest łatwe w użyciu i prawdopodobnie najbardziej przydatne z przedstawionych tutaj opcji, więc rozważ wypróbowanie tego następnym razem, gdy będziesz musiał stawić czoła scenariuszowi, który nie robi tego, co według ciebie.

Powiązane samouczki Linux:

  • Jak propagować sygnał do procesów dziecka z bash…
  • Mastering Bash Script Loops
  • Jak wykonywać operacje administracyjne z Ansible…
  • Zagnieżdżone pętle w skryptach Bash
  • Jak używać bash subshells w środku, jeśli instrukcje
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Jak korzystać z ADB Android Debug Bridge do zarządzania Androidem…
  • Bash, jeśli stwierdzenia: jeśli, elif, else, to fi
  • Optymalizacja wydajności Linux: Narzędzia i techniki