Kā izsekot komandu izpildi čaulas skriptā ar čaulas izsekošanu


Šajā čaulas skriptu atkļūdošanas sērijas rakstā mēs izskaidrosim trešo čaulas skriptu atkļūdošanas režīmu, tas ir, čaulas izsekošanu, un apskatīsim dažus piemērus, lai parādītu, kā tas darbojas un kā to var izmantot.

Šīs sērijas iepriekšējā daļa skaidri izgaismo divus pārējos čaulas skriptu atkļūdošanas režīmus: izteiksmīgu režīmu un sintakses pārbaudes režīmu ar viegli saprotamiem piemēriem, kā iespējot čaulas skriptu atkļūdošanu šajos režīmos.

  1. Kā iespējot čaulas skriptu atkļūdošanas režīmu Linux - 1. daļa
  2. Kā veikt atkļūdošanas režīma sintakses pārbaudi čaulas skriptos - 2. daļa

Apvalka izsekošana vienkārši nozīmē komandu izpildes izsekošanu čaulas skriptā. Lai ieslēgtu čaulas izsekošanu, izmantojiet atkļūdošanas opciju -x .

Tas liek čaulai parādīt visas komandas un to argumentus terminālā, kad tie tiek izpildīti.

Mēs izmantosim zemāk esošo čaulas skriptu sys_info.sh , kas īsi izdrukā jūsu sistēmas datumu un laiku, pieteikto lietotāju skaitu un sistēmas darbības laiku. Tomēr tajā ir sintakses kļūdas, kas mums jāatrod un jālabo.

#!/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

Saglabājiet failu un izveidojiet skriptu izpildāmu. Skriptu var palaist tikai ar root, tāpēc izmantojiet komandu sudo, lai to palaistu, kā norādīts zemāk:

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

No iepriekš minētās izejas mēs varam novērot, ka komanda vispirms tiek izpildīta, pirms tās izeja tiek aizstāta kā mainīgā vērtība.

Piemēram, datums pirmo reizi tika izpildīts un tā izeja tika aizstāta kā mainīgā DATE vērtība.

Mēs varam veikt sintakses pārbaudi, lai parādītu sintakses kļūdas tikai šādi:

$ sudo bash -n sys_info.sh 

Ja kritiski skatāmies uz čaulas skriptu, mēs sapratīsim, ka if note trūkst aizvēroša vārda fi . Tāpēc pievienosim to un jaunajam skriptam tagad vajadzētu izskatīties šādi:

#!/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

Vēlreiz saglabājiet failu un izsauciet to kā root un veiciet sintakses pārbaudi:

$ sudo bash -n sys_info.sh

Iepriekš minētās sintakses pārbaudes darbības rezultāts joprojām parāda, ka mūsu skriptā 21. rindā ir vēl viena kļūda. Tātad mums joprojām ir jāveic daži sintakses labojumi.

Ja vēl vienu reizi analītiski apskatīsim skriptu, kļūda 21. rindā ir saistīta ar to, ka trūkst aizvēršanas dubultās pēdiņas (”) pēdējā atbalss komandā funkcijas print_sys_info iekšpusē .

Komandā echo pievienosim noslēdzošo dubultcitāru un saglabāsim failu. Mainītais skripts ir zemāk:

#!/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

Tagad sintaktiski pārbaudiet skriptu vēl vienu reizi.

$ sudo bash -n sys_info.sh

Iepriekš minētā komanda neradīs nekādu izvadi, jo mūsu skripts tagad ir sintaktiski pareizs. Mēs varam arī izsekot skripta izpildi visu otro reizi, un tam vajadzētu darboties labi:

$ sudo bash -x sys_info.sh

Tagad palaidiet skriptu.

$ sudo ./sys_info.sh

Shell Script izpildes izsekošanas nozīme

Korpusa skriptu izsekošana palīdz mums identificēt sintakses kļūdas un, vēl svarīgāk, loģiskās kļūdas. Piemēram, apvalka skriptā sys_info.sh izmantojiet funkciju check_root , kas ir paredzēta, lai noteiktu, vai lietotājs ir root vai nav, jo skriptu ir atļauts izpildīt ko lieto superlietotājs.

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

Burvību šeit kontrolē if note izteiksme ["$UID" -ne "$ROOT_ID"]] , tiklīdz mēs neizmantojam piemērotu skaitlisko operatoru ( -ne šajā gadījumā, kas nozīmē, ka nav vienāds), mēs nonākam pie iespējamas loģiskas kļūdas.

Pieņemot, ka mēs izmantojām -eq (tas nozīmē vienāds ar), tas ļautu jebkuram sistēmas lietotājam, kā arī root lietotājam palaist skriptu, tādējādi radot loģisku kļūdu.

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

Piezīme. Kā jau iepriekš apskatījām šīs sērijas sākumā, iestatītā čaulas iebūvētā komanda var aktivizēt atkļūdošanu noteiktā čaulas skripta sadaļā.

Tāpēc zemāk redzamā rinda palīdzēs mums atrast šo loģisko kļūdu funkcijā, izsekojot tās izpildi:

Skripts ar loģisku kļūdu:

#!/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

Saglabājiet failu un izsauciet skriptu, mēs varam redzēt, ka parasts sistēmas lietotājs var palaist skriptu bez sudo, kā parādīts zemāk. Tas ir tāpēc, ka USER_ID vērtība ir 100, kas nav vienāda ar root ROOT_ID, kas ir 0.

$ ./sys_info.sh

Nu, tas ir tas, ka tagad mēs esam nonākuši čaulas skriptu atkļūdošanas sērijas beigās. Zemāk esošo atbildes veidlapu var izmantot, lai adresētu mums visus jautājumus vai atsauksmes par šo ceļvedi vai visu 3 daļu sēriju.