Jak debugować skrypt bash?

How Debug Bash Script




Każdy program musi być wolny od błędów, zanim dotrze do konsumentów. Twórcy oprogramowania dokładają wszelkich starań, aby programy były wolne od błędów. Ale trudno jest sprawić, by kod był bezbłędny, gdy są tysiące wierszy. Debugowanie jest procesem ciągłym; pomaga w natychmiastowym wykrywaniu błędów, zbieraniu cennych informacji o kodzie i eliminowaniu zbędnych fragmentów kodu.

Wszystkie języki programowania mają pewne wspólne i kilka odrębnych podejść do wyszukiwania błędów. Na przykład programy do debugowania mogą służyć do szybkiego usuwania błędów. Podczas gdy skrypty powłoki nie mają żadnego konkretnego narzędzia do debugowania kodu. Ten artykuł dotyczy omówienia różnych technik debugowania, które można wykorzystać, aby skrypt bash był wolny od błędów. Zanim zagłębimy się w metody, przyjrzyjmy się podstawowym powłokom i skryptom powłoki:







Jaka jest powłoka w Linuksie?

Kiedy uruchamiasz komputer, jądro pobiera informacje o podłączonym sprzęcie i umożliwia interakcję innym podłączonym komponentom. Poza tym zarządza pamięcią, procesorem i rozpoznaje każde nowe urządzenie peryferyjne. Podsumowując, jądro jest podstawą każdego systemu operacyjnego. Ale czy kiedykolwiek myślałeś o bezpośredniej interakcji z jądrem, wydaniu mu polecenia wykonania określonego zadania? Czy to w ogóle wykonalne? Absolutnie! Za pomocą powłoki, programu komputerowego z interaktywnym interfejsem, każdy może obsługiwać jądro. Powłoka pozwala ludziom na interakcję z jądrem i nakazuje wykonanie dowolnego zadania.



W systemie Unix istnieją dwie główne powłoki Muszla Bourne'a oraz Powłoka C . Oba te typy mają swoje podkategorie. Różne rodzaje muszli Bourne'a są Muszla Korna (ksh), muszla Almquista (jesion), muszla Bourne'a (bash), oraz Powłoka Z (zsh) . Jednocześnie powłoka C ma swoje własne podkategorie, takie jak Powłoka C (csh) oraz Powłoka TENEX C (tczsz) . Jak wspomniano powyżej, ze wszystkich muszli, Bash (znowu muszla Bourne'a) jest najczęściej używaną powłoką i wychodzi z pudełka w wielu dystrybucjach Linuksa ze względu na swoją wydajność i przyjazność dla użytkownika.



Bash jest domyślną powłoką wielu dystrybucji Linuksa i jest szeroko używany przez miliony użytkowników Linuksa. Jest tak różnorodny i wpływowy, że może wykonać każde zadanie, które zwykle wykonujesz w aplikacjach opartych na graficznym interfejsie użytkownika. Możesz edytować pliki, zarządzać plikami, przeglądać zdjęcia, słuchać muzyki, odtwarzać filmy i wiele więcej.





Co to jest skrypt powłoki:

Ponieważ poznaliśmy podstawową ideę powłoki, przejdźmy teraz do skryptów powłoki. Skrypt powłoki to program komputerowy, który wykonuje wiele poleceń w powłoce, która działa jako interpreter wykonujący określoną funkcję. Jak omówiono powyżej, istnieją 2 szczególne rodzaje pocisków. Jednak ten przewodnik koncentruje się na powłoce Bourne Again (Bash).
Czym więc jest skrypt bash? W Linuksie wszystkie polecenia bash są przechowywane w /usr/bin i /bin lornetka składana. Na przykład, za każdym razem, gdy uruchamiasz polecenie, bash szuka, czy istnieje w katalogu, czy nie. Polecenie zostanie wykonane, jeśli znajdzie się w katalogach, w przeciwnym razie wystąpi błąd.

Co powiesz na wykonanie zadania, które wymaga wielu poleceń do uruchomienia w terminalu? W tej konkretnej sytuacji może pomóc skryptowanie bash. Skrypty bash to forma skryptów powłoki, która umożliwia tworzenie programów do uruchamiania wielu poleceń bash w celu wykonania określonego zadania.



Jakie są błędy w skryptowaniu bash:

Podczas pracy ze skryptami bash lub innymi językami programowania napotkasz wiele błędów. Błąd to błąd lub usterka w programie, która może spowodować nieprawidłowe działanie programu.

Każdy język programowania ma swoją własną procedurę wyszukiwania błędów; podobnie, bash ma również wiele wbudowanych opcji debugowania programu terminala.

Zarządzanie błędami i debugowanie programu to nie mniej niż kłopot. Jest to czasochłonna praca i może się pogorszyć, jeśli nie znasz odpowiednich narzędzi do debugowania programu. Ten artykuł jest kompletnym przewodnikiem na temat debugowania skryptów bash, aby Twój skrypt był wolny od błędów. Zacznijmy więc:

Jak debugować skrypt bash:

Podczas pracy nad dużymi projektami programistycznymi napotykasz wiele błędów lub błędów. Debugowanie programu może być czasami skomplikowane. Programiści zwykle używają narzędzi do debugowania, a wiele edytorów kodu pomaga również w znajdowaniu błędów poprzez podświetlanie składni.

W Linuksie są różne narzędzia do debugowania kodów, na przykład GNU Debugger aka gdb. Narzędzia takie jak GDB są przydatne w przypadku języków programowania, które kompilują się w pliki binarne. Ponieważ bash jest prostym językiem interpretowanym, nie ma potrzeby używania ciężkich narzędzi do jego debugowania.

Istnieje wiele tradycyjnych technik debugowania kodu skryptowego bash, a jedną z nich jest dodawanie Asercje. Asercje to warunki dodawane w programach w celu sprawdzenia określonych warunków i odpowiedniego wykonania programu. Jest to technika defensywna, która pomaga również w znajdowaniu błędów i testowaniu. Możesz znaleźć wiele narzędzia które pomagają w dodawaniu asercji w skryptach basha.

Cóż, dodawanie asercji jest jedną ze starych tradycyjnych technik. W bash są dostępne zestawy flag/opcji do debugowania skryptu bash. Te opcje mogą być dodawane wraz z shebangiem w skryptach lub podczas wykonywania programu w terminalu. Poniżej przedstawiamy tematy, którymi się zajmiemy:

  1. Jak debugować skrypt bash poprzez włączenie gadatliwe -v opcja
  2. Jak debugować skrypt bash za pomocą xtras -x opcja
  3. Jak debugować skrypt bash za pomocą noexec -n opcja
  4. Jak rozpoznać nieustawione zmienne podczas debugowania skryptu bash
  5. Jak debugować konkretna część skryptu basha
  6. Jak debugować skrypt bash za pomocą pułapka Komenda
  7. Jak debugować skrypt bash poprzez eliminację globbing plików używając -F opcja
  8. Jak łączyć opcje debugowania do debugowania skryptu powłoki
  9. Jak przekieruj raport debugowania do pliku

Sprawdźmy więc różne techniki w bash, aby debugować skrypt basha:

1. Jak debugować skrypt bash, włączając opcję verbose -v:

Jednym z najłatwiejszych podejść do debugowania skryptu bash jest użycie -v opcja, znana również jako gadatliwa. Opcja może być dodana z hukiem lub jawnie umieszczona z nazwą pliku skryptu podczas jego wykonywania. Opcja verbose wykona i wydrukuje każdy wiersz kodu jako proces interpretera. Zrozummy to na przykładzie skryptu bash:

#! /bin/bash
wyrzucił „Wprowadź numer 1”
czytaćnumer 1
wyrzucił „Wprowadź numer 2”
czytaćnumer 2
Jeśli [ '$numer1' -gt '$numer2' ]
następnie
wyrzucił „Liczba1 jest większa niż Liczba2”
Elifa [ '$numer1' -równe '$numer2' ]
następnie
wyrzucił 'Numer1 jest równy Numerowi2'
w przeciwnym razie
wyrzucił „Liczba2 jest większa niż Liczba1”
być

Powyższy kod pobiera od użytkownika dwie liczby, a następnie wykonuje kilka instrukcji warunkowych, aby sprawdzić, czy liczba jest ważniejsza, mniejsza lub równa drugiej wprowadzonej liczbie. Chociaż do skryptów basha można użyć dowolnego edytora tekstu, ja używam edytora Vima. Vim to potężny, bogaty w funkcje edytor, który podkreśla składnię skryptów basha i zmniejsza ryzyko błędów składniowych. Jeśli nie masz edytora Vima, pobierz go, uruchamiając polecenie wymienione poniżej:

$sudotrafnyzainstalować przyszedłem

Utwórz plik skryptu bash za pomocą:

$przyszedłemb_skrypt.sh

Jeśli jesteś nowy w edytorze Vima, polecam się uczyć jak korzystać z edytora vim przed kontynuowaniem.

Teraz wróć do skryptu, uruchom skrypt za pomocą -v opcja:

$grzmotnąć -vb_skrypt.sh

Jak widać na powyższym wyjściu, każda linia skryptu jest wypisywana w terminalu podczas przetwarzania przez interpreter. Zauważ, że skrypt przestanie przyjmować dane wejściowe od użytkownika, a następnie przetworzy następny wiersz skryptu. Jak omówiono powyżej, -v opcję można umieścić po shebangu, jak pokazano poniżej:

#! / kosz / bash -v

Podobnie, gadatliwa flaga może być również dodana w następnej linii shebang za pomocą ustawić Komenda:

#! /bin/bash
ustawić -v

Każda z omówionych powyżej metod może włączyć tryb gadatliwy.

2 Jak debugować skrypt bash za pomocą opcji xtrace -x:

Śledzenie wykonania, znane również jako xtrace, jest inteligentną i przydatną opcją debugowania, zwłaszcza do śledzenia błędów logicznych. Błędy logiczne są zwykle związane ze zmiennymi i poleceniami. Aby sprawdzić stan zmiennej podczas wykonywania skryptu, używamy -x opcja. Teraz ponownie uruchom b_skrypt.sh plik z -x flaga:

$grzmotnąć -xb_skrypt.sh

Dane wyjściowe wyraźnie pokazują wartość każdej zmiennej podczas procesu wykonywania. Ponownie, -x może być używany obok linii shebang i po linii shebang za pomocą polecenia set. Xtrace umieszcza znak + w każdym wierszu skryptu.

3 Jak debugować skrypt bash za pomocą opcji noexec -n:

Błędy składniowe są jedną z głównych przyczyn błędów. Aby syntaktycznie debugować skrypt bash, używamy noexec (brak wykonania). Opcja używana w trybie noexec to -n. Wyświetli tylko błędy składni kodu zamiast go wykonać. O wiele bezpieczniejsze podejście do debugowania kodu. Wykonajmy b_skrypt.sh ponownie z -n opcja:

$grzmotnąć -nb_skrypt.sh

Kod nie zostanie wykonany, jeśli nie wystąpi błąd składni. Teraz zmodyfikujmy nasz kod:

#! /bin/bash

wyrzucił „Wprowadź numer 1”
czytaćnumer 1
wyrzucił „Wprowadź numer 2”
czytaćnumer 2
Jeśli [ '$numer1' -gt '$numer2' ]
następnie
wyrzucił „Liczba1 jest większa niż Liczba2”
Elifa [ '$numer1' -równe '$numer2' ]
#następnie
wyrzucił 'Numer1 jest równy Numerowi2'
w przeciwnym razie
wyrzucił „Liczba2 jest większa niż Liczba1”
być

komentuję następnie po Elifa . Teraz z -n wykonaj b_skrypt.sh scenariusz:

$grzmotnąć -nb_skrypt.sh

Zgodnie z przewidywaniami wyraźnie zidentyfikował błąd i wyświetlił go w terminalu.

4 Jak zidentyfikować nieustawione zmienne podczas debugowania skryptu bash:

Popełnianie literówki podczas pisania kodu jest powszechne. Często błędnie wpisujesz zmienną, co uniemożliwia wykonanie kodu. Aby zidentyfikować taki błąd, używamy -u opcja. Zmodyfikujmy kod jeszcze raz:

#! /bin/bash
wyrzucił „Wprowadź numer 1”
czytaćnumer 1
wyrzucił „Wprowadź numer 2”
czytaćnumer 2
Jeśli [ '$num1' -gt '$numer2' ]
następnie
wyrzucił „Liczba1 jest większa niż Liczba2”
Elifa [ '$numer1' -równe '$numer2' ]
następnie
wyrzucił 'Numer1 jest równy Numerowi2'
w przeciwnym razie
wyrzucił „Liczba2 jest większa niż Liczba1”
być

Na początku Jeśli oświadczenie warunkowe, zmieniłem nazwę numer 1 zmienna do numer1 . Ale już numer1 jest zmienną nieustawioną. Teraz uruchom skrypt:

$grzmotnąć -ub_skrypt.sh

Dane wyjściowe zidentyfikowały i jawnie wyświetlają nazwę nieustawionej zmiennej.

5. Jak debugować konkretną część skryptu bash:

Tryb xtrace przetwarza każdy wiersz kodu i daje wynik. Jednak znalezienie błędów w dużym kodzie byłoby czasochłonne, jeśli już wiemy, która część potencjalnie powoduje błąd. Na szczęście xtrace pozwala również na debugowanie określonej części kodu, co można osiągnąć za pomocą ustawić Komenda. Miejsce zestaw -x na początku fragmentu, który należy debugować, a następnie ustaw +x na końcu. Na przykład chcę debugować instrukcje warunkowe b_skrypt.sh , więc wszystkie instrukcje warunkowe załączę w zestaw -x oraz ustaw +x opcje, jak pokazano w poniższym kodzie:

#! /bin/bash
wyrzucił „Wprowadź numer 1”
czytaćnumer 1
wyrzucił „Wprowadź numer 2”
czytaćnumer 2
ustawić -x
Jeśli [ '$liczba' -gt '$numer2' ]
następnie
wyrzucił „Liczba1 jest większa niż Liczba2”
Elifa [ '$numer1' -równe '$numer2' ]
następnie
wyrzucił 'Numer1 jest równy Numerowi2'
w przeciwnym razie
wyrzucił „Liczba2 jest większa niż Liczba1”
być
ustawić+ x

Teraz uruchom skrypt za pomocą bash b_script.sh .

Dane wyjściowe debugują tylko określone warunki if.

6. Jak debugować skrypt bash za pomocą polecenia trap:

Jeśli twój skrypt jest skomplikowany, istnieje również więcej zaawansowanych technik debugowania. Jednym z nich jest pułapka Komenda. ten pułapka polecenie przechwytuje sygnały i wykonuje polecenie, gdy wystąpi konkretna sytuacja. Polecenie może być sygnałem lub funkcją. Stworzyłem kolejny skrypt pod nazwą sum_script.sh :

#! /bin/bash
pułapka 'echo 'Wiersz ${LINENO}: Pierwsza liczba to $number1 , Druga liczba to $number2 a suma to $sum' 'ODPLUSKWIĆ
wyrzucił „Wprowadź pierwszą liczbę”
czytaćnumer 1
wyrzucił „Wprowadź drugą liczbę”
czytaćnumer 2
suma= $[numer1 + numer2]
wyrzucił „suma jest”$sum'

ten pułapka polecenie z ODPLUSKWIĆ sygnał wyświetla status zmiennych numer 1 , numer 2 oraz suma po wykonaniu każdej linii, jak pokazano na poniższym obrazie wyjściowym:

Żółte bloki to puste miejsca, ponieważ użytkownik nie wprowadził jeszcze żadnych danych; te miejsca zapełnią się, gdy użytkownik wprowadzi wartości. Ta metoda jest również bardzo pomocna w debugowaniu skryptów basha.

7. Jak debugować skrypt basha, eliminując zglobbing plików za pomocą opcji -f:

Globbing plików to proces wyszukiwania plików ze znakami wieloznacznymi, tj. * oraz ? . W wielu sytuacjach nie musisz rozszerzać plików podczas debugowania. W takich przypadkach możesz zablokować zglobbing pliku za pomocą -F opcja. Zrozummy to za pomocą skryptu fglobe_script.sh :

#! /bin/bash
wyrzucił 'Wyświetl wszystkie pliki tekstowe.'
ls *.tekst

Powyższy kod wyświetli wszystkie pliki tekstowe w bieżącym katalogu, wykonaj:

$grzmotnąćfglobe_script.sh

Aby wyłączyć funkcję zwielokrotniania plików, użyj -F opcja:

$grzmotnąć -Ffglobe_script.sh

Podobnie możesz użyć go z shebang i z ustawić polecenie również:

#! /bin/bash
wyrzucił 'Wyświetl wszystkie pliki tekstowe.'
ls *.tekst
ustawić -F
wyrzucił 'Wyświetl wszystkie pliki tekstowe'
ls *.tekst
ustawić+f

Teraz biegnij bash fglobe_script.sh:

Porcja dołączona do zbiór -f/zbiór +f opcje nie przetwarzały poleceń ze znakami wieloznacznymi.

8. Jak połączyć opcje debugowania z debugowaniem skryptu powłoki:

Używamy tylko jednej opcji w wyżej wymienionych technikach debugowania, ale możemy łączyć różne opcje dla lepszego zrozumienia. Zaimplementujmy -x oraz -v opcje do sum_script.sh scenariusz. używam sum_script.sh scenariusz.

#! /bin/bash
wyrzucił „Wprowadź pierwszą liczbę”
czytaćnumer 1
wyrzucił „Wprowadź drugą liczbę”
czytaćnumer 2
suma= $[numer1 + numer2]
wyrzucił „suma jest”$sum'

Teraz wykonaj:

$grzmotnąć -xvsum_script.sh

Obie -x oraz -v dane wyjściowe są łączone, jak pokazano na obrazie wyjściowym. Podobnie możemy również łączyć -u opcja z gadatliwym -v do wykrywania błędów. Wymieniam numer 1 zmienna z na jednego w szóstym wierszu scenariusza:

#! /bin/bash
jest$numer2orazsumajest$sum' ' DEBUGUJ
wyrzucił '
Wpisz pierwszy numer'
przeczytaj numer1
wyrzucił '
Wpisz drugą liczbę'
przeczytaj numer2
suma=$[liczba + liczba2]
wyrzucił '
tensumajest$sum'

Aby wyświetlić dane wyjściowe, uruchom poniższe polecenie:

$grzmotnąć -uvsum_script.sh

9. Jak przekierować raport debugowania do pliku:

Zapisanie raportu debugowania skryptu bash do pliku może być przydatne w wielu sytuacjach. Jest to trochę trudne, ponieważ przekierować raport debugowania do pliku; używamy specjalnych zmiennych. Zaimplementujmy to na b_skrypt.sh kod:

#! /bin/bash
exec 5>raport_dubug.log
BASH_XTRACED=„5”
PS4='$ LINIA NIE--'
wyrzucił „Wprowadź numer 1”
czytaćnumer 1
wyrzucił „Wprowadź numer 2”
czytaćnumer 2
Jeśli [ '$liczba' -gt '$numer2' ]
następnie
wyrzucił „Liczba1 jest większa niż Liczba2”
Elifa [ '$numer1' -równe '$numer2' ]
następnie
wyrzucił 'Numer1 jest równy Numerowi2'
w przeciwnym razie
wyrzucił „Liczba2 jest większa niż Liczba1”
być

W drugim wierszu kodu widać, że przekierowujemy wyjście do a raport_debugowania.log plik za pomocą exec polecenie z deskryptorem pliku 5 (FD5).

exec 5> debug_raport.log: ten exec polecenie przekierowuje wszystko, co dzieje się w powłoce, do pliku raport_debugowania.log.

BASH_XTRACEFD=5: To jest konkretna zmienna bash i nie może być używany w żadnej innej powłoce. Musi mieć przypisany poprawny deskryptor pliku, a bash zapisze wyodrębnione dane wyjściowe do raport_debugowania.log.

PS4=’$LINENIE– ‘: Jest to również zmienna bash używana do drukowania numeru linii podczas debugowania w trybie xtrace. Domyślna wartość PS4 to + znak

Powyższy skrypt generuje plik dziennika o nazwie raport_debugowania.log, aby to przeczytać, użyj Kot Komenda:

Wniosek:

Kod pełen błędów może wpływać na wydajność programu i szkodzić również sprzętowi. Debugowanie jest bardzo ważne dla każdego programu, ponieważ sprawia, że ​​program jest bardziej wydajny. Znalezienie istniejących i potencjalnych błędów podczas tworzenia programu może uniemożliwić nieoczekiwane zachowanie programu. Duże kody zwykle wymagają aktywnego debugowania, zwiększając efektywność kodu poprzez eliminację regresu pochłaniającego fragmenty kodu.

Wiele języków programowania i środowisk ma własne debugery towarzyszące. W skryptach bash można zastosować różne techniki debugowania skryptu. Ten przewodnik dokładnie skoncentrował się na wszystkich metodach, które można wykorzystać do znalezienia błędów w skryptach basha. Jeśli więc czujesz, że twój skrypt bash nie działa zgodnie z oczekiwaniami, użyj dowolnej z wyżej wymienionych technik, ale tryb xtrace (-x) jest w większości przypadków bardzo pomocny.