Jak śledzić wykonywanie poleceń w skrypcie powłoki z śledzeniem powłoki

Jak śledzić wykonywanie poleceń w skrypcie powłoki z śledzeniem powłoki

W tym artykule z serii debugowania skryptu Shell wyjaśnimy tryb debugowania skryptu trzeciego powłoki, czyli śledzenie powłoki i spojrzymy na niektóre przykłady, aby pokazać, jak to działa i jak można go użyć.

Poprzednia część tej serii wyraźnie rzuca światło na dwa pozostałe tryby debugowania skryptu Shell: Tryb wetbose I Sprawdzanie składni Tryb z łatwymi do zrozumienia przykładami sposobu włączenia debugowania skryptu Shell w tych trybach.

  1. Jak włączyć tryb debugowania skryptu Shell w Linux - część 1
  2. Jak wykonywać tryb debugowania składni w skontlerze

Śledzenie powłoki oznacza po prostu śledzenie wykonywania poleceń w skrypcie powłoki. Aby włączyć śledzenie powłoki, użyj -X Opcja debugowania.

To kieruje powłożenie do wyświetlania wszystkich poleceń i ich argumentów na terminalu podczas ich wykonywania.

Użyjemy sys_info.cii skrypt powłoki poniżej, który krótko drukuje datę i godzinę systemu, liczba użytkowników zalogowanych i czas pracy systemu. Zawiera jednak błędy składniowe, które musimy znaleźć i poprawić.

#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„EXIT 1; print_sys_info () echo” System Time: $ data "Echo" Liczba użytkowników: $ no_users "echo" Uptime: $ uptime check_root print_sys_info exit 0 

Zapisz plik i uczyń skrypt wykonywalny. Skrypt można uruchomić tylko przez root, a zatem zastosuj polecenie sudo, aby uruchomić go jak poniżej:

$ chmod +x sys_info.sh $ sudo bash -x sys_info.cii 
Śledzenie powłoki - Pokaż błąd w skrypcie

Z powyższego wyjścia możemy zaobserwować, że polecenie jest wykonywane po raz pierwszy, zanim jego wyjście zostanie zastąpione jako wartość zmiennej.

Na przykład data został po raz pierwszy wykonany, a jego wyjście zastąpiono jako wartość zmiennej DATA.

Możemy wykonać sprawdzanie składni, aby wyświetlić błędy składniowe w następujący sposób:

$ sudo bash -n sys_info.cii 
Sprawdzanie składni w skrypcie

Jeśli spojrzymy na skrypt powłoki, zdamy sobie sprawę, że If oświadczenie brakuje zamknięcia fi słowo. Dlatego dodajmy to, a nowy skrypt powinien teraz wyglądać jak poniżej:

#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo„ czas systemowy: $ data ”liczba użytkowników: $ no_users„ echo ”Uptime: $ uptime check_root print_sys_info exit 0 

Zapisz ponownie plik i wywołaj go jako root i wykonaj sprawdzanie składni:

$ sudo bash -n sys_info.cii 
Wykonaj sprawdzanie składni w skontlerze

Wynik naszej operacji sprawdzania składni powyżej wciąż pokazuje, że w naszym skrypcie jest jeszcze jeden błąd Linia 21. Więc nadal mamy do zrobienia pewną korektę składniową.

Jeśli przejrzymy skrypt analitycznie jeszcze raz, błąd Linia 21 jest spowodowane brakującym podwójnym cytatem zamykania (”) w ostatnim poleceniu echo w środku print_sys_info funkcjonować.

Dodamy podwójny cytat zamykający w Echo polecenie i zapisz plik. Zmieniony skrypt jest poniżej:

#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -Ne "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo„ czas systemowy: $ data ”liczba użytkowników: $ no_users„ echo ”Uptime: $ uptime” check_root print_sys_info exit 0 

Teraz składnie sprawdź skrypt jeszcze raz.

$ sudo bash -n sys_info.cii 

Powyższe polecenie nie wytworzy żadnego wyjścia, ponieważ nasz skrypt jest teraz poprawny składniowo. Również możemy prześledzić wykonanie skryptu po raz drugi i powinno działać dobrze:

$ sudo bash -x sys_info.cii 
Śledź wykonanie skryptu powłoki

Teraz uruchom skrypt.

$ sudo ./sys_info.cii 
Skrypt powłoki, aby pokazać datę, godzinę i czas aktualizacji

Znaczenie wykonywania skryptu powłoki

Śledzenie skryptów powłoki pomaga nam zidentyfikować błędy składniowe i, co ważniejsze, błędy logiczne. Weźmy na przykład Check_root funkcja w sys_info.cii skrypt powłoki, który ma na celu ustalenie, czy użytkownik jest root, czy nie, ponieważ skrypt może być wykonywany tylko przez superuser.

check_root () if ["$ uid" -Ne "$ root_id"]; Następnie echo „Nie możesz wykonać tego programu!„Wyjdź 1; fi 

Magia tutaj jest kontrolowana przez If oświadczenie wyrażenie [„$ Uid” -Ne „$ root_id”], Gdy nie używamy odpowiedniego operatora numerycznego (-ne W takim przypadku, co oznacza nie równe), kończymy możliwym błędem logicznym.

Zakładając, że użyliśmy -Eq (oznacza równe), pozwoliłoby to każdemu użytkownikowi systemu, a także użytkownik root uruchomienie skryptu, stąd błąd logiczny.

check_root () if ["$ uid" -eq "$ root_id"]; Następnie echo „Nie możesz wykonać tego programu!„Wyjdź 1; fi 

Notatka: Jak spojrzeliśmy wcześniej na początku tej serii, wbudowane polecenie Set Shell może aktywować debugowanie w określonej części skryptu powłoki.

Dlatego poniższy wiersz pomoże nam znaleźć ten błąd logiczny w funkcji, śledząc jego wykonanie:

Skrypt z błędem logicznym:

#!/bin/bash #script, aby wydrukować krótkie informacje o systemie root_id = "0" data = „data” no_users = "kto | Wc -L" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; Następnie echo „Nie możesz wykonać tego programu!„Exit 1; fi print_sys_info () echo” System Time: $ date "echo" Liczba użytkowników: $ no_users "echo" Uptime: $ uptime " #Turning On i wyłączanie debugowania funkcji check_root -x; check_root; ; set +x; print_sys_info exit 0 

Zapisz plik i wywołać skrypt, widzimy, że zwykły użytkownik systemu może uruchomić skrypt bez sudo jak w poniższym wyjściu. Jest tak, ponieważ wartość IDENTYFIKATOR UŻYTKOWNIKA Jest 100 który nie jest równy korzeniowi Root_id który jest 0.

$ ./sys_info.cii 
Uruchom skrypt powłoki bez sudo

Cóż, na razie dotarliśmy do końca serii debugowania skryptów Shell, poniższy formularz odpowiedzi można użyć do odpowiedniego nam pytań lub informacji zwrotnych, dotyczące tego przewodnika lub całej serii 3-częściowej serii.