Wéi verfollegt d'Ausféierung vu Kommandoen am Shell Skript mat Shell Tracing


An dësem Artikel vun der Shell Skript Debugging Serie wäerte mir den drëtten Shell Skript Debugging Modus erklären, dat ass Shell Tracing a kuckt e puer Beispiller fir ze demonstréieren wéi et funktionnéiert a wéi et benotzt ka ginn.

De viregten Deel vun dëser Serie werft kloer Liicht op déi zwee aner Shell Skript Debugging Modi: verbose Modus a Syntax Checking Modus mat einfach ze verstoen Beispiller wéi Dir Shell Skript Debugging an dëse Modi aktivéiert.

  1. Wéi aktivéiert de Shell Script Debugging Mode am Linux - Deel 1
  2. Wéi ausféieren Syntax Checking Debugging Modus a Shell Scripten - Deel 2

Shell Tracing heescht einfach d'Ausféierung vun de Kommandoen an engem Shell-Skript ze verfolgen. Fir Shell Tracing opzemaachen, benotzt d'-x Debugging Optioun.

Dëst leet d'Schuel fir all Kommandoen an hir Argumenter um Terminal ze weisen wéi se ausgefouert ginn.

Mir benotzen de sys_info.sh Shell-Skript hei drënner, deen Äre Systemdatum an -Zäit, d'Zuel vun de Benotzer ugemellt an d'Systemuptime kuerz ausdréckt. Wéi och ëmmer, et enthält Syntaxfehler déi mir musse fannen a korrigéieren.

#!/bin/bash
#script to print brief system info

ROOT_ID="0"

DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;    
}

print_sys_info(){
    echo "System Time    : $DATE"
    echo "Number of users: $NO_USERS"
    echo "System Uptime  : $UPTIME
}

check_root
print_sys_info

exit 0

Späichert d'Datei a maacht de Skript ausféierbar. De Skript kann nëmme vu Root ausgeführt ginn, dofir benotzt de sudo Kommando fir et auszeféieren wéi hei ënnen:

$ chmod +x sys_info.sh
$ sudo bash -x sys_info.sh

Vun der Ausgab hei uewen kënne mir beobachten datt e Kommando fir d'éischt ausgefouert gëtt ier säin Ausgang als Wäert vun enger Variabel ersat gëtt.

Zum Beispill gouf den Datum fir d'éischt ausgefouert an seng Ausgang gouf als Wäert vun der Variabel DATE ersat.

Mir kënnen Syntaxprüfung ausféieren fir nëmmen d'Syntaxfehler wéi follegt ze weisen:

$ sudo bash -n sys_info.sh 

Wa mir de Shell-Skript kritesch kucken, wäerte mir feststellen datt d'if Ausso e Schluss fi Wuert fehlt. Dofir, loosst eis et derbäisetzen an den neie Skript soll elo wéi hei ënnen ausgesinn:

#!/bin/bash
#script to print brief system info

ROOT_ID="0"

DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
   fi    
}

print_sys_info(){
    echo "System Time    : $DATE"
    echo "Number of users: $NO_USERS"
    echo "System Uptime  : $UPTIME
}

check_root
print_sys_info

exit 0

Späichert d'Datei nach eng Kéier an rufft se als Root un a maacht e puer Syntaxprüfung:

$ sudo bash -n sys_info.sh

D'Resultat vun eiser Syntax-Kontrolloperatioun uewendriwwer weist nach ëmmer datt et nach ee Feeler an eisem Skript op der Linn 21 ass. Also, mir hunn nach e puer Syntaxkorrektur ze maachen.

Wa mir d'Skript nach eng Kéier analytesch duerchkucken, ass de Feeler op der Linn 21 wéinst engem fehlenden Ofschlosszitat (”) am leschten Echo Kommando an der print_sys_info Funktioun .

Mir addéieren d'Ofschlossduebelzitat am Echo Kommando a späicheren d'Datei. De geännerten Skript ass hei ënnen:

#!/bin/bash
#script to print brief system info

ROOT_ID="0"

DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

print_sys_info(){
    echo "System Time    : $DATE"
    echo "Number of users: $NO_USERS"
    echo "System Uptime  : $UPTIME"
}

check_root
print_sys_info

exit 0

Iwwerpréift elo syntaktesch de Skript nach eng Kéier.

$ sudo bash -n sys_info.sh

De Kommando hei uewen wäert keen Ausgang produzéieren well eise Skript elo syntaktesch korrekt ass. Mir kënnen och d'Ausféierung vum Skript all fir eng zweete Kéier verfollegen an et soll gutt funktionnéieren:

$ sudo bash -x sys_info.sh

Elo lafen de Skript.

$ sudo ./sys_info.sh

Wichtegkeet vun Shell Skript Ausféierung Tracing

Shell Skript Tracing hëlleft eis Syntaxfehler z'identifizéieren a méi wichteg, logesch Feeler. Huelt zum Beispill d'Funktioun check_root am sys_info.sh Shell-Skript, deen geduecht ass fir ze bestëmmen ob e Benotzer root ass oder net, well de Skript nëmmen erlaabt ass auszeféieren. vum Superuser.

check_root(){
    if [ "$UID" -ne "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

D'Magie hei gëtt kontrolléiert vum if Ausso Ausdrock [ \$UID\ -ne \$ROOT_ID\ ], wa mir de passenden numeresche Bedreiwer net benotzen (-ne an dësem Fall, dat heescht net gläich ), komme mir mat engem méigleche logesche Feeler.

Unzehuelen datt mir -eq benotzt hunn ( heescht gläich wéi), dëst erlaabt all System Benotzer wéi och de Root Benotzer de Skript auszeféieren, also e logesche Feeler.

check_root(){
    if [ "$UID" -eq "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

Bemierkung: Wéi mir virdru um Ufank vun dëser Serie gekuckt hunn, kann de Set Shell agebaute Kommando Debugging an enger bestëmmter Sektioun vun engem Shell-Skript aktivéieren.

Dofir hëlleft d'Linn hei ënnen eis dëse logesche Feeler an der Funktioun ze fannen andeems se hir Ausféierung verfollegt:

De Skript mat engem logesche Feeler:

#!/bin/bash
#script to print brief system info

ROOT_ID="0"

DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`

check_root(){
    if [ "$UID" -eq "$ROOT_ID" ]; then
        echo "You are not allowed to execute this program!"
        exit 1;
    fi
}

print_sys_info(){
    echo "System Time    : $DATE"
    echo "Number of users: $NO_USERS"
    echo "System Uptime  : $UPTIME"
}

#turning on and off debugging of check_root function
set -x ; check_root;  set +x ;
print_sys_info

exit 0

Späichert d'Datei an rufft de Skript op, mir kënne gesinn datt e reguläre Systembenotzer de Skript ouni Sudo ausféiere kann wéi an der Ausgab hei ënnen. Dëst ass well de Wäert vun USER_ID 100 ass, wat net gläich ass wéi Root ROOT_ID wat 0 ass.

$ ./sys_info.sh

Gutt, dat ass et fir de Moment, mir sinn um Enn vun der Shell Skript Debugging Serie komm, d'Äntwertform hei ënnen kann benotzt ginn fir all Froen oder Feedback un eis ze adresséieren, betreffend dëse Guide oder déi ganz 3-Deel Serie.