Wyszukiwanie w witrynie

Jak wykonać tryb debugowania sprawdzania składni w skryptach powłoki


Zaczęliśmy serię debugowania skryptów powłoki od wyjaśnienia różnych opcji debugowania i włączania trybów debugowania skryptów powłoki.

Po napisaniu skryptów powłoki zaleca się praktyczne sprawdzenie składni skryptów przed ich uruchomieniem, zamiast sprawdzania ich wyników w celu potwierdzenia, że działają poprawnie.

W tej części serii omówimy, jak korzystać z trybu debugowania sprawdzającego składnię. Pamiętaj, że wyjaśniliśmy różne opcje debugowania w pierwszej części tej serii, a tutaj użyjemy ich do przeprowadzenia debugowania skryptu.

Włączanie trybu pełnego debugowania

Zanim przejdziemy do głównego tematu tego przewodnika, przyjrzyjmy się krótko trybowi szczegółowemu. Włącza się ją poprzez opcję debugowania -v, która nakazuje powłoce wyświetlanie wszystkich wierszy skryptu podczas ich odczytu.

Aby zademonstrować, jak to działa, poniżej znajduje się przykładowy skrypt powłoki do zbiorczej konwersji obrazów PNG do formatu JPG.

Wpisz (lub skopiuj i wklej) go do pliku.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Następnie zapisz plik i spraw, aby skrypt był wykonywalny, używając poniższego polecenia:

chmod +x script.sh

Możemy wywołać skrypt i wyświetlić wszystkie zawarte w nim linie tak, jak są one odczytywane przez powłokę, w następujący sposób:

bash -v script.sh

Włączanie trybu debugowania sprawdzania składni w skryptach powłoki

Wracając do naszego głównego tematu, -n aktywuje tryb sprawdzania składni. Instruuje powłokę, aby zasadniczo przeczytała wszystkie polecenia, jednak ich nie wykonuje, ona (powłoka) jedynie sprawdza zastosowaną składnię.

W przypadku wystąpienia błędów w skrypcie powłoki, powłoka wyświetli błędy na terminalu, w przeciwnym razie nic nie wyświetli.

Składnia aktywacji sprawdzania składni jest następująca:

bash -n script.sh

Ponieważ składnia w skrypcie jest poprawna, powyższe polecenie nie wyświetli żadnych wyników. Dlatego spróbujmy usunąć słowo done zamykające pętlę for i zobaczmy, czy wyświetla błąd:

Poniżej znajduje się zmodyfikowany skrypt powłoki do zbiorczej konwersji obrazów PNG do formatu jpg, który zawiera błąd.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Zapisz plik, a następnie uruchom go, sprawdzając w nim składnię:

bash -n script.sh

Z powyższych danych wynika, że w naszym skrypcie występuje problem ze składnią, w pętli for brakuje zamykającego słowa kluczowego done. Powłoka szukała go aż do końca pliku, a gdy go nie znalazła (gotowe), wyświetliła błąd składniowy:

script.sh: line 11: syntax error: unexpected end of file

Możemy także połączyć tryb szczegółowy i tryb sprawdzania składni:

bash -vn script.sh

Alternatywnie możemy włączyć sprawdzanie składni, modyfikując pierwszą linię powyższego skryptu, jak w następnym przykładzie.

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Tak jak poprzednio, zapisz plik i uruchom go podczas sprawdzania składni:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

Dodatkowo możemy zastosować wbudowane polecenie set Shell, aby włączyć tryb debugowania w powyższym skrypcie.

W poniższym przykładzie sprawdzamy jedynie składnię pętli for w naszym skrypcie.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Jeszcze raz zapisz plik i wywołaj skrypt:

./script.sh 

Podsumowując, powinniśmy zawsze upewnić się, że przed ich wykonaniem sprawdzamy składnię naszych skryptów powłoki, aby wychwycić wszelkie błędy.

Aby przesłać nam pytania lub uwagi dotyczące tego przewodnika, skorzystaj z poniższego formularza odpowiedzi. W trzeciej części tej serii przejdziemy do wyjaśnienia i wykorzystania trybu debugowania śledzenia powłoki.