Come tracciare l'esecuzione dei comandi in Shell Script con Shell Tracing

In questo articolo del serie di debug di script di shell, spiegheremo la terza modalità di debug dello script di shell, ovvero la traccia della shell e esamineremo alcuni esempi per dimostrare come funziona e come può essere utilizzata.

La parte precedente di questa serie getta chiaramente luce sulle altre due modalità di debug degli script di shell: modalità verbosa e controllo della sintassi mode con esempi di facile comprensione su come abilitare il debug degli script di shell in queste modalità.

  1. Come abilitare la modalità di debug degli script della shell in Linux – Parte 1
  2. Come eseguire il controllo della sintassi in modalità di debug negli script di shell - Parte 2

Tracciare la shell significa semplicemente tracciare l'esecuzione dei comandi in uno script di shell. Per attivare il tracciamento della shell, utilizzare il -X opzione di debug.

Questo indica alla shell di visualizzare tutti i comandi e i loro argomenti sul terminale mentre vengono eseguiti.

Useremo il sys_info.sh shell script di seguito, che stampa brevemente la data e l'ora del sistema, il numero di utenti che hanno effettuato l'accesso e il tempo di attività del sistema. Tuttavia, contiene errori di sintassi che dobbiamo trovare e correggere.

#!/bin/bash. #script per stampare brevi informazioni di sistema ROOT_ID="0" DATE=`date` NO_USERS=`chi | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; } print_sys_info(){ echo "Ora del sistema: $DATE" echo "Numero di utenti: $NO_USERS" echo "Tempo di attività del sistema: $UPTIME. } check_root. print_sys_info uscita 0.

Salva il file e rendi eseguibile lo script. Lo script può essere eseguito solo da root, quindi utilizza il comando sudo per eseguirlo come di seguito:

$ chmod +x sys_info.sh. $ sudo bash -x sys_info.sh. 
Tracciamento shell - Mostra errore nello script
Tracciamento shell – Mostra errore nello script

Dall'output sopra, possiamo osservare che un comando viene prima eseguito prima che il suo output venga sostituito come valore di una variabile.

Ad esempio, il Data è stato eseguito per la prima volta e il suo output è stato sostituito come valore della variabile DATA.

Possiamo eseguire il controllo della sintassi per visualizzare solo gli errori di sintassi come segue:

$ sudo bash -n sys_info.sh 
Controllo della sintassi nello script
Controllo della sintassi nello script

Se osserviamo lo script della shell in modo critico, ci renderemo conto che il se dichiarazione manca una chiusura fi parola. Pertanto, aggiungiamolo e il nuovo script dovrebbe ora apparire come di seguito:

#!/bin/bash. #script per stampare brevi informazioni di sistema ROOT_ID="0" DATE=`date` NO_USERS=`chi | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; fi } print_sys_info(){ echo "Ora del sistema: $DATE" echo "Numero di utenti: $NO_USERS" echo "Tempo di attività del sistema: $UPTIME. } check_root. print_sys_info uscita 0.

Salva di nuovo il file e richiamalo come root ed esegui un controllo della sintassi:

$ sudo bash -n sys_info.sh. 
Eseguire il controllo della sintassi negli script della shell
Eseguire il controllo della sintassi negli script della shell

Il risultato della nostra operazione di controllo della sintassi sopra mostra ancora che c'è un altro bug nel nostro script on linea 21. Quindi, abbiamo ancora alcune correzioni sintattiche da fare.

Se esaminiamo analiticamente lo script ancora una volta, l'errore si accende linea 21 è dovuto a una doppia virgoletta di chiusura mancante (”) nell'ultimo comando eco dentro il print_sys_info funzione.

Aggiungeremo la doppia virgoletta di chiusura nel eco comando e salvare il file. Lo script modificato è di seguito:

#!/bin/bash. #script per stampare brevi informazioni di sistema ROOT_ID="0" DATE=`date` NO_USERS=`chi | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; fi. } print_sys_info(){ echo "Ora del sistema: $DATE" echo "Numero di utenti: $NO_USERS" echo "Tempo di attività del sistema: $UPTIME" } check_root. print_sys_info uscita 0.

Ora controlla sintatticamente lo script ancora una volta.

$ sudo bash -n sys_info.sh. 

Il comando sopra non produrrà alcun output perché il nostro script ora è sintatticamente corretto. Possiamo anche tracciare l'esecuzione dello script tutto per una seconda volta e dovrebbe funzionare bene:

$ sudo bash -x sys_info.sh. 
Esecuzione dello script della shell di traccia
Esecuzione dello script della shell di traccia

Ora esegui lo script.

$ sudo ./sys_info.sh. 
Script di shell per mostrare data, ora e tempo di attività
Script di shell per mostrare data, ora e tempo di attività

Importanza della traccia dell'esecuzione dello script della shell

La traccia degli script della shell ci aiuta a identificare gli errori di sintassi e, soprattutto, gli errori logici. Prendi ad esempio il check_root funzione in sys_info.sh script di shell, che ha lo scopo di determinare se un utente è root o meno, poiché lo script può essere eseguito solo dal superutente.

check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; fi. }

La magia qui è controllata dal se dichiarazione espressione [ "$UID" -ne "$ID_ROOT" ], una volta che non si usa l'operatore numerico adatto (-ne in questo caso, che significa non uguale ), ci ritroviamo con un possibile errore logico.

Supponendo che abbiamo usato -eq ( significa uguale a), ciò consentirebbe a qualsiasi utente di sistema e all'utente root di eseguire lo script, quindi un errore logico.

check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; fi. }

NotaNota: come abbiamo visto prima all'inizio di questa serie, il comando integrato set shell può attivare il debug in una particolare sezione di uno script di shell.

Pertanto, la riga seguente ci aiuterà a trovare questo errore logico nella funzione tracciandone l'esecuzione:

Lo script con un errore logico:

#!/bin/bash. #script per stampare brevi informazioni di sistema ROOT_ID="0" DATE=`date` NO_USERS=`chi | wc -l` UPTIME=`uptime` check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "Non sei autorizzato a eseguire questo programma!" uscita 1; fi. } print_sys_info(){ echo "Ora del sistema: $DATE" echo "Numero di utenti: $NO_USERS" echo "Tempo di attività del sistema: $UPTIME" } #attivazione e disattivazione del debug della funzione check_root. impostare -x; check_root; imposta +x; print_sys_info uscita 0.

Salva il file e invoca lo script, possiamo vedere che un normale utente di sistema può eseguire lo script senza sudo come nell'output di seguito. Questo perché il valore di ID UTENTE è 100 che non è uguale a radice ROOT_ID che è 0.

$ ./sys_info.sh. 
Esegui script shell senza Sudo
Esegui script shell senza Sudo

Bene, per ora è tutto, siamo arrivati ​​alla fine del serie di debug di script di shell, il modulo di risposta sottostante può essere utilizzato per rivolgerci qualsiasi domanda o feedback, riguardante questa guida o l'intera serie in 3 parti.

Teachs.ru