“Shell Tracing” bilen “Shell” skriptindäki buýruklaryň ýerine ýetirilişini nädip yzarlamaly


Gabyk skriptini düzetmek seriýasynyň bu makalasynda, gabyk yzarlamak üçin üçünji gabyk skriptini düzetmek tertibini düşündireris we işleýşini we ulanylyşyny görkezmek üçin käbir mysallara serederis.

Bu tapgyryň öňki bölümi, beýleki iki gabyk skriptini düzetmek reesimine aç-açan täsir edýär: bu reesimlerde gabyk skriptini düzetmegiň nädip aňsat boljakdygyna düşnükli mysallar bilen söz düzümi we sintaksis barlag tertibi.

  1. Linux-da gabyk skriptini düzetmek tertibini nädip açmaly - 1-nji bölüm
  2. Gabyk skriptlerinde sintaksis barlagyny düzetmek tertibini nädip ýerine ýetirmeli - 2-nji bölüm

Gabyk gözlemek, buýruklaryň ýerine ýetirilişini gabyk skriptinde yzarlamagy aňladýar. Gabyk yzyny açmak üçin -x düzediş opsiýasyny ulanyň.

Bu, gabygy ýerine ýetirilende terminalda ähli buýruklary we argumentleri görkezmäge gönükdirýär.

Aşakdaky sys_info.sh gabyk skriptini ulanarys, bu ulgamyňyzyň senesini we wagtyny, giren ulanyjylaryň sanyny we ulgamyň iş wagtyny gysgaça çap edýär. Şeýle-de bolsa, tapmaly we düzetmeli sintaksis säwlikleri bar.

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

Faýly ýazdyryň we skripti ýerine ýetirip bilersiňiz. Scriptazgy diňe kök bilen işledilip bilner, şonuň üçin sudo buýrugyny aşakdaky ýaly işletmek üçin ulanyň:

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

Aboveokardaky çykyşdan, buýrugyň üýtgeýjiniň bahasy hökmünde çalşylmazdan ozal ýerine ýetirilendigini synlap bileris.

Mysal üçin, sene ilki ýerine ýetirildi we çykyşy üýtgeýän DATE-iň bahasy hökmünde çalşyryldy.

Sintaksis ýalňyşlyklaryny diňe sintaksis ýalňyşlyklaryny görkezmek üçin ýerine ýetirip bileris:

$ sudo bash -n sys_info.sh 

Gabyk skriptine tankydy göz aýlasak, jümle ýapylýan fi sözüniň ýokdugyna göz ýetireris. Şonuň üçin goşalyň we täze skript indi aşakdaky ýaly bolmaly:

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

Faýly täzeden ýazdyryň we kök hökmünde çagyryň we sintaksis barlagyny geçiriň:

$ sudo bash -n sys_info.sh

Aboveokardaky sintaksis barlagymyzyň netijesi, 21-nji setirdäki skriptimizde ýene bir näsazlygyň bardygyny görkezýär. Şeýlelik bilen, henizem sintaksis düzedişleri bar.

Scriptazgyny analitiki taýdan ýene bir gezek gözden geçirsek, 21-nji setirdäki ýalňyşlyk, print_sys_info funksiýasynyň içindäki iň soňky echo buýrugynda () ýapylýan goşa sitatanyň ýoklugy bilen baglanyşyklydyr. .

Echo buýrugyna ýapylýan goşa sitata goşarys we faýly ýatda saklarys. Üýtgedilen skript aşakda:

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

Indi ssenariýany ýene bir gezek barlaň.

$ sudo bash -n sys_info.sh

Aboveokardaky buýruk hiç hili netije bermez, sebäbi skriptimiz sintaktik taýdan dogry. Şeýle hem, skriptiň ýerine ýetirilişini ikinji gezek yzarlap bileris we bu gowy işlemeli:

$ sudo bash -x sys_info.sh

Indi skripti işlediň.

$ sudo ./sys_info.sh

“Shell script” ýerine ýetiriş yzarlamasynyň ähmiýeti

Gabyk skriptini gözlemek bize sintaksis ýalňyşlyklaryny we has möhümi logiki ýalňyşlyklary kesgitlemäge kömek edýär. Mysal üçin, ulanyjynyň kökdigini ýa-da ýokdugyny kesgitlemek üçin niýetlenen sys_info.sh gabyk skriptindäki check_root funksiýasyny alyň, sebäbi skriptiň diňe ýerine ýetirilmegine rugsat berilýär. superuser tarapyndan.

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

Bu ýerdäki jady, degişli san operatory ulanmasak, aňlatmasy aňlatmasy [\ $UID\-ne\$ROOT_ID \] tarapyndan dolandyrylýar. ( -ne bu ýagdaýda deň däl diýmekdir), ähtimal logiki ýalňyşlyk bilen gutararys.

-eq (deň diýmekdir) ulanandygymyzy göz öňünde tutsak, bu islendik ulgam ulanyjysyna-da, kök ulanyja-da skript işlemäge mümkinçilik berer, şonuň üçin logiki ýalňyşlyk.

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

Bellik: Bu seriýanyň başynda öňem seredip geçişimiz ýaly, gurlan gabyk gurnalan buýruk, gabyk skriptiniň belli bir bölüminde düzedişleri işjeňleşdirip biler.

Şonuň üçin aşakdaky setir, ýerine ýetirilişini yzarlamak bilen funksiýadaky bu logiki ýalňyşlygy tapmaga kömek eder:

Logiki ýalňyşlyk bilen skript:

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

Faýly ýazdyryň we skripti çagyryň, adaty ulgam ulanyjysynyň skriptini aşakdaky çykyşdaky ýaly sudo ulanman işledip biljekdigini görüp bileris. Munuň sebäbi USER_ID-iň bahasy 100, ROOT_ID köküne deň däl 100.

$ ./sys_info.sh

Dogrusy, häzirlikçe, gabyk skriptini düzetmek tapgyrynyň soňuna geldik, aşakdaky jogap formasy bu gollanma ýa-da tutuş 3 bölümli seriýa bilen baglanyşykly islendik soraglary ýa-da seslenmeleri çözmek üçin ulanylyp bilner.