Giunsa Pagsubay ang Pagpatuman sa mga Sugo sa Shell Script gamit ang Shell Tracing


Niining artikulo sa shell script debugging series, among ipasabot ang ikatulo nga shell script debugging mode, nga mao ang shell tracing ug tan-awon ang pipila ka mga pananglitan aron ipakita kung giunsa kini pagtrabaho, ug kung giunsa kini magamit.

Ang miaging bahin sa kini nga serye tin-aw nga naghatag kahayag sa duha ka lain nga shell script debugging mode: verbose mode ug syntax checking mode nga adunay dali masabtan nga mga pananglitan kung unsaon pag-enable ang shell script debugging niini nga mga mode.

  1. Unsaon Pag-enable ang Shell Script Debugging Mode sa Linux – Bahin 1
  2. Unsaon Pagbuhat sa Syntax Checking Debugging Mode sa Shell Scripts – Bahin 2

Ang pagsubay sa shell nagpasabot lamang sa pagsubay sa pagpatuman sa mga sugo sa usa ka script sa shell. Aron i-on ang pagsubay sa kabhang, gamita ang -x nga kapilian sa pag-debug.

Gimandoan niini ang kabhang aron ipakita ang tanan nga mga mando ug ang ilang mga argumento sa terminal samtang kini gipatuman.

Gamiton namo ang sys_info.sh shell script sa ubos, nga mu-print sa makadiyot sa imong sistema sa petsa ug oras, gidaghanon sa mga tiggamit nga naka-log in ug sa sistema sa oras sa pagtrabaho. Bisan pa, kini adunay mga sayup sa syntax nga kinahanglan namon pangitaon ug tul-iron.

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

I-save ang file ug himoa nga executable ang script. Ang script mahimo ra nga ipadagan pinaagi sa gamut, busa gamita ang sudo nga mando aron ipadagan kini sama sa ubos:

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

Gikan sa output sa ibabaw, atong maobserbahan nga, ang usa ka command una nga gipatuman sa dili pa ang output niini gipulihan isip bili sa usa ka variable.

Pananglitan, ang petsa unang gipatuman ug ang output niini gipuli ingong bili sa variable DATE.

Makahimo kami sa pagsusi sa syntax aron ipakita lamang ang mga sayup sa syntax sama sa mosunod:

$ sudo bash -n sys_info.sh 

Kung atong tan-awon pag-ayo ang script sa shell, atong maamgohan nga ang if statement kulang ug panapos nga fi nga pulong. Busa, atong idugang kini ug ang bag-ong script kinahanglan nga tan-awon sama sa ubos:

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

I-save ang file pag-usab ug gamita kini ingon gamut ug buhata ang pipila nga pagsusi sa syntax:

$ sudo bash -n sys_info.sh

Ang resulta sa atong syntax checking operation sa ibabaw nagpakita gihapon nga adunay usa pa ka bug sa atong script sa linya 21. Busa, aduna pa kitay pipila ka syntax correction nga buhaton.

Kung atong tan-awon ang script sa makausa pa, ang sayup sa linya 21 tungod sa usa ka nawala nga panapos nga dobleng kinutlo () sa katapusang echo command sulod sa print_sys_info function. .

Atong idugang ang panapos nga dobleng kinutlo sa echo command ug i-save ang file. Ang giusab nga script anaa sa ubos:

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

Karon syntactically susihon ang script sa makausa pa.

$ sudo bash -n sys_info.sh

Ang sugo sa ibabaw dili makahatag ug bisan unsa nga output tungod kay ang atong script karon syntactically husto. Mahimo usab naton masubay ang pagpatuman sa script tanan sa ikaduha nga higayon ug kinahanglan kini molihok nga maayo:

$ sudo bash -x sys_info.sh

Karon pagdagan ang script.

$ sudo ./sys_info.sh

Kahinungdanon sa Pagsubay sa Pagpatuman sa Shell Script

Ang pagsubay sa Shell script makatabang kanamo sa pag-ila sa mga sayup sa syntax ug labi ka hinungdanon, mga lohikal nga sayup. Tagda pananglitan ang check_root function sa sys_info.sh shell script, nga gituyo aron mahibal-an kung ang usa ka user gamut o dili, tungod kay ang script gitugotan lamang nga ipatuman sa superuser.

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

Ang salamangka dinhi kontrolado sa kon pahayag ekspresyon [ \$UID\ -ne \$ROOT_ID\ ], sa higayon nga dili na namo gamiton ang angay nga numerical operator (-ne niini nga kaso, nga nagpasabut nga dili managsama ), kita adunay usa ka posible nga lohikal nga sayup.

Sa paghuna-huna nga among gigamit ang -eq ( nagpasabot nga katumbas sa), kini magtugot sa bisan kinsa nga tiggamit sa sistema ingon man sa gamut nga tiggamit sa pagpadagan sa script, busa usa ka lohikal nga sayop.

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

Mubo nga sulat: Sama sa among gitan-aw kaniadto sa pagsugod niini nga serye, ang set shell built-in command mahimong mag-activate sa debugging sa usa ka partikular nga seksyon sa shell script.

Busa, ang linya sa ubos makatabang kanato sa pagpangita niining lohikal nga sayop sa function pinaagi sa pagsubay sa pagpatuman niini:

Ang script nga adunay usa ka lohikal nga sayup:

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

I-save ang file ug i-invoke ang script, atong makita nga ang usa ka regular nga user system makadagan sa script nga walay sudo sama sa output sa ubos. Kini tungod kay ang bili sa USER_ID kay 100 nga dili katumbas sa gamut ROOT_ID nga 0.

$ ./sys_info.sh

Aw, mao kana alang sa karon, miabut kami sa katapusan sa shell script debugging serye, ang tubag nga porma sa ubos mahimong gamiton sa pagtubag sa bisan unsa nga mga pangutana o feedback kanato, mahitungod niini nga giya o sa tibuok 3-bahin nga serye.