Jinsi ya Kufuatilia Utekelezaji wa Amri katika Hati ya Shell na Ufuatiliaji wa Shell


Katika nakala hii ya safu ya utatuzi wa hati ya ganda, tutaelezea hali ya tatu ya utatuzi wa hati ya ganda, ambayo ni ufuatiliaji wa ganda na kuangalia mifano kadhaa ili kuonyesha jinsi inavyofanya kazi, na jinsi inavyoweza kutumika.

Sehemu iliyotangulia ya mfululizo huu inatoa mwangaza kwa njia nyingine mbili za utatuzi wa hati ya ganda: modi ya kitenzi na hali ya kukagua sintaksia yenye mifano rahisi kueleweka ya jinsi ya kuwezesha utatuzi wa hati ya ganda katika hali hizi.

  1. Jinsi ya Kuwasha Hali ya Utatuzi wa Hati ya Shell katika Linux - Sehemu ya 1
  2. Jinsi ya Kutekeleza Hali ya Kukagua Sintaksia katika Hati za Shell - Sehemu ya 2

Ufuatiliaji wa Shell unamaanisha tu kufuatilia utekelezaji wa amri kwenye hati ya ganda. Ili kuwasha ufuatiliaji wa ganda, tumia -x chaguo la utatuzi.

Hii inaelekeza ganda kuonyesha amri zote na hoja zao kwenye terminal zinapotekelezwa.

Tutatumia hati ya ganda la sys_info.sh hapa chini, ambayo huchapisha kwa ufupi tarehe na saa ya mfumo wako, idadi ya watumiaji walioingia na saa ya juu ya mfumo. Walakini, ina makosa ya sintaksia ambayo tunahitaji kupata na kusahihisha.

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

Hifadhi faili na ufanye hati itekelezwe. Hati inaweza kuendeshwa na mzizi tu, kwa hivyo tumia sudo amri kuiendesha kama ilivyo hapo chini:

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

Kutoka kwa matokeo hapo juu, tunaweza kuona kwamba, amri inatekelezwa kwanza kabla ya pato lake kubadilishwa kama thamani ya kutofautisha.

Kwa mfano, tarehe ilitekelezwa kwa mara ya kwanza na matokeo yake yakabadilishwa kuwa thamani ya kigezo cha DATE.

Tunaweza kufanya ukaguzi wa sintaksia ili kuonyesha tu makosa ya sintaksia kama ifuatavyo:

$ sudo bash -n sys_info.sh 

Ikiwa tutaangalia hati ya ganda kwa umakini, tutagundua kuwa if statement inakosa neno la kufunga la fi. Kwa hivyo, wacha tuiongeze na hati mpya inapaswa kuonekana kama hapa chini:

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

Hifadhi faili tena na iombe kama mzizi na uangalie syntax:

$ sudo bash -n sys_info.sh

Matokeo ya utendakazi wetu wa kukagua sintaksia hapo juu bado yanaonyesha kuwa kuna hitilafu moja zaidi katika hati yetu kwenye mstari wa 21. Kwa hivyo, bado tuna marekebisho ya sintaksia ya kufanya.

Tukichunguza hati kwa uchanganuzi mara moja zaidi, hitilafu kwenye mstari wa 21 inatokana na kukosa nukuu mbili za kufunga (”) katika amri ya mwisho ya mwangwi ndani ya print_sys_info chaguo la kukokotoa. .

Tutaongeza nukuu ya kufunga mara mbili katika amri ya echo na kuhifadhi faili. Nakala iliyobadilishwa iko hapa chini:

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

Sasa angalia hati kwa kisintatiki kwa mara nyingine.

$ sudo bash -n sys_info.sh

Amri iliyo hapo juu haitatoa matokeo yoyote kwa sababu hati yetu sasa ni sahihi kisintaksia. Tunaweza pia kufuatilia utekelezaji wa hati yote kwa mara ya pili na inapaswa kufanya kazi vizuri:

$ sudo bash -x sys_info.sh

Sasa endesha hati.

$ sudo ./sys_info.sh

Umuhimu wa Ufuatiliaji wa Utekelezaji wa Hati ya Shell

Ufuatiliaji wa hati ya Shell hutusaidia kutambua makosa ya sintaksia na muhimu zaidi, makosa ya kimantiki. Chukua kwa mfano kipengele cha check_root katika sys_info.sh hati ya shell, ambayo inakusudiwa kubainisha kama mtumiaji ni mzizi au la, kwa kuwa hati inaruhusiwa tu kutekelezwa. na mtumiaji mkuu.

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

Uchawi hapa unadhibitiwa na usemi wa if statement [ \$UID\ -ne \$ROOT_ID\ ], mara tusipotumia opereta anayefaa wa nambari. (-ne katika kesi hii, ambayo ina maana si sawa ), tunaishia na kosa linalowezekana la kimantiki.

Kwa kudhani kuwa tulitumia -eq ( maana yake ni sawa na), hii ingeruhusu mtumiaji yeyote wa mfumo na vile vile mtumiaji wa mizizi kuendesha hati, kwa hivyo hitilafu ya kimantiki.

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

Kumbuka: Kama tulivyoangalia hapo awali mwanzoni mwa safu hii, amri iliyowekwa ndani ya ganda inaweza kuamsha utatuzi katika sehemu fulani ya hati ya ganda.

Kwa hivyo, mstari ulio hapa chini utatusaidia kupata hitilafu hii ya kimantiki katika kazi kwa kufuatilia utekelezaji wake:

Hati iliyo na hitilafu ya kimantiki:

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

Hifadhi faili na uombe hati, tunaweza kuona kuwa mtumiaji wa kawaida wa mfumo anaweza kuendesha hati bila sudo kama kwenye matokeo hapa chini. Hii ni kwa sababu thamani ya USER_ID ni 100 ambayo si sawa na mzizi ROOT_ID ambayo ni 0.

$ ./sys_info.sh

Naam, ndivyo ilivyo kwa sasa, tumefika mwisho wa mfululizo wa utatuzi wa hati ya ganda, fomu ya majibu iliyo hapa chini inaweza kutumika kushughulikia maswali au maoni yoyote kwetu, kuhusu mwongozo huu au mfululizo mzima wa sehemu 3.