ວິທີການຕິດຕາມການປະຕິບັດຂອງ ຄຳ ສັ່ງໃນ Shell Script ດ້ວຍ Shell Tracing


ໃນບົດຂຽນນີ້ຂອງຊຸດ shell script debugging, ພວກເຮົາຈະອະທິບາຍຮູບແບບການ ກຳ ນົດແກະສະຫຼັກແກະແບບທີສາມ, ນັ້ນແມ່ນການຕິດຕາມຫອຍແລະເບິ່ງບາງຕົວຢ່າງເພື່ອສະແດງວິທີການໃຊ້ງານ, ແລະມັນສາມາດໃຊ້ໄດ້ແນວໃດ.

ສ່ວນກ່ອນ ໜ້າ ນີ້ຂອງຊຸດນີ້ຈະເຮັດໃຫ້ເຫັນແສງສະຫວ່າງທີ່ແຕກຕ່າງກັນສອງຮູບແບບຄື: ໂຫມດ verbose ແລະ ໂໝດ ກວດສອບ syntax ດ້ວຍຕົວຢ່າງທີ່ເຂົ້າໃຈງ່າຍກ່ຽວກັບວິທີການເຮັດໃຫ້ shell shell debugging ໃນຮູບແບບເຫຼົ່ານີ້.

<

  • ວິທີການເປີດໃຊ້ ໂໝດ Debugging Shell Script ໃນ Linux - ພາກທີ 1
  • ວິທີ ດຳ ເນີນການກວດສອບ Syntax ໃນການກວດສອບ Debugging mode ໃນສະຄິບ Shell - ພາກທີ 2
  • ການຫອຍນາງລົມ ໝາຍ ເຖິງການຕິດຕາມການປະຕິບັດ ຄຳ ສັ່ງໃນຫອຍແກະ. ເພື່ອສະຫຼັບການເຈາະຮອຍຫອຍ, ໃຊ້ຕົວເລືອກ debugging -x .

    ສິ່ງນີ້ຊີ້ ນຳ ຫອຍເພື່ອສະແດງ ຄຳ ສັ່ງທັງ ໝົດ ແລະ ຄຳ ໂຕ້ແຍ້ງຂອງພວກມັນຢູ່ເທິງປາຍທາງໃນຂະນະທີ່ພວກມັນຖືກປະຕິບັດ.

    ພວກເຮົາຈະໃຊ້ຕົວອັກສອນຫອຍ sys_info.sh ຂ້າງລຸ່ມນີ້ເຊິ່ງຈະບອກໄລຍະສັ້ນໆກ່ຽວກັບວັນທີແລະເວລາຂອງລະບົບຂອງທ່ານ, ຈຳ ນວນຜູ້ໃຊ້ເຂົ້າສູ່ລະບົບແລະເວລາລະບົບ. ເຖິງຢ່າງໃດກໍ່ຕາມ, ມັນມີຂໍ້ຜິດພາດຂອງ syntax ທີ່ພວກເຮົາຕ້ອງການຊອກຫາແລະແກ້ໄຂ.

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

    ບັນທຶກເອກະສານແລະເຮັດໃຫ້ສະຄິບ ດຳ ເນີນການໄດ້. ສະຄິບສາມາດ ດຳ ເນີນການໄດ້ໂດຍໃຊ້ຮາກເທົ່ານັ້ນ, ສະນັ້ນຈຶ່ງໃຊ້ ຄຳ ສັ່ງ sudo ເພື່ອ ດຳ ເນີນການດັ່ງລຸ່ມນີ້:

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

    ຈາກຜົນໄດ້ຮັບຂ້າງເທິງ, ພວກເຮົາສາມາດສັງເກດເຫັນວ່າ, ຄຳ ສັ່ງ ໜຶ່ງ ຖືກປະຕິບັດກ່ອນທີ່ຜົນຜະລິດຂອງມັນຈະຖືກແທນທີ່ເປັນຄ່າຂອງຕົວແປ.

    ຕົວຢ່າງ, ວັນທີຖືກປະຕິບັດເປັນຄັ້ງ ທຳ ອິດແລະຜົນຜະລິດຂອງມັນຖືກແທນທີ່ຄ່າຂອງຕົວປ່ຽນ DATE.

    ພວກເຮົາສາມາດກວດສອບ syntax ເພື່ອສະແດງຂໍ້ຜິດພາດຂອງ syntax ເທົ່ານັ້ນ:

    $ sudo bash -n sys_info.sh 
    

    ຖ້າພວກເຮົາເບິ່ງຫອຍຫອຍທີ່ ສຳ ຄັນ, ພວກເຮົາຈະຮູ້ວ່າ ຖ້າ ຄຳ ຖະແຫຼງ ຂາດ ຄຳ ວ່າປິດ fi . ເພາະສະນັ້ນ, ໃຫ້ພວກເຮົາເພີ່ມມັນແລະບົດຂຽນໃຫມ່ຄວນເບິ່ງຄືວ່າຢູ່ຂ້າງລຸ່ມນີ້:

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

    ບັນທຶກເອກະສານອີກເທື່ອ ໜຶ່ງ ແລະຂໍເປັນຮາກແລະເຮັດການກວດສອບ syntax ບາງຢ່າງ:

    $ sudo bash -n sys_info.sh
    

    ຜົນຂອງການປະຕິບັດການກວດສອບ syntax ຂອງພວກເຮົາຂ້າງເທິງນີ້ຍັງສະແດງໃຫ້ເຫັນວ່າມັນມີຂໍ້ບົກຜ່ອງອີກອັນ ໜຶ່ງ ໃນຕົວອັກສອນຂອງພວກເຮົາຢູ່ໃນເສັ້ນ 21. ດັ່ງນັ້ນ, ພວກເຮົາຍັງມີການແກ້ໄຂ syntax ບາງຢ່າງທີ່ຕ້ອງເຮັດ.

    ຖ້າພວກເຮົາເບິ່ງຜ່ານບົດວິເຄາະເທື່ອ ໜຶ່ງ, ຂໍ້ຜິດພາດໃນເສັ້ນ 21 ແມ່ນຍ້ອນ ຄຳ ເວົ້າຄູ່ປິດທີ່ຂາດຫາຍໄປ (”) ໃນ ຄຳ ສັ່ງແອັກໂກ້ສຸດທ້າຍພາຍໃນ ໜ້າ ທີ່ print_sys_info .

    ພວກເຮົາຈະເພີ່ມ ຄຳ ເວົ້າຄູ່ປິດໃນ ຄຳ ສັ່ງແອັກໂກ້ແລະບັນທຶກເອກະສານ. ຕົວອັກສອນທີ່ປ່ຽນແປງຢູ່ດ້ານລຸ່ມ:

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

    ດຽວນີ້ກວດເບິ່ງຕົວອັກສອນອີກຄັ້ງ ໜຶ່ງ.

    $ sudo bash -n sys_info.sh
    

    ຄຳ ສັ່ງທີ່ກ່າວມາຂ້າງເທິງຈະບໍ່ໃຫ້ຜົນຜະລິດຫຍັງເລີຍເພາະວ່າຕອນນີ້ສະຄິບຂອງພວກເຮົາຖືກຕ້ອງທາງສັງເຄາະ. ພວກເຮົາກໍ່ສາມາດຕິດຕາມການປະຕິບັດຂອງຕົວ ໜັງ ສືທັງ ໝົດ ເປັນຄັ້ງທີສອງແລະມັນຄວນຈະເຮັດວຽກໄດ້ດີ:

    $ sudo bash -x sys_info.sh
    

    ໃນປັດຈຸບັນດໍາເນີນການສະຄິບ.

    $ sudo ./sys_info.sh
    

    ຄວາມ ສຳ ຄັນຂອງການຕິດຕາມການປະຕິບັດ Shell Script

    ການຕິດຕາມສະຄິບ Shell ຊ່ວຍໃຫ້ພວກເຮົາສາມາດລະບຸຂໍ້ຜິດພາດຂອງ syntax ແລະສິ່ງທີ່ ສຳ ຄັນກວ່ານັ້ນແມ່ນຂໍ້ຜິດພາດທີ່ມີເຫດຜົນ. ຍົກຕົວຢ່າງ ໜ້າ ທີ່ check_root ທີ່ຢູ່ໃນສະຄິບແກະ sys_info.sh ເຊິ່ງມີຈຸດປະສົງເພື່ອ ກຳ ນົດວ່າຜູ້ໃຊ້ຮາກຫຼືບໍ່, ເພາະວ່າສະຄິບພຽງແຕ່ຖືກອະນຸຍາດໃຫ້ປະຕິບັດ ໂດຍ superuser.

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

    ເວດມົນຢູ່ທີ່ນີ້ຖືກຄວບຄຸມໂດຍ ຖ້າ ຄຳ ຖະແຫຼງ ການສະແດງອອກ ["$UID" -ne "$ROOT_ID"] , ເມື່ອພວກເຮົາບໍ່ໃຊ້ຕົວ ດຳ ເນີນການຕົວເລກທີ່ ເໝາະ ສົມ ( -ne ໃນກໍລະນີນີ້, ເຊິ່ງ ໝາຍ ຄວາມວ່າບໍ່ສະ ເໝີ ພາບກັນ), ພວກເຮົາຈົບລົງດ້ວຍຂໍ້ຜິດພາດທີ່ມີເຫດຜົນ.

    ສົມມຸດວ່າພວກເຮົາໃຊ້ -eq (ໝາຍ ຄວາມວ່າເທົ່າກັບ), ນີ້ຈະຊ່ວຍໃຫ້ຜູ້ໃຊ້ລະບົບໃດ ໜຶ່ງ ກໍ່ຄືຜູ້ໃຊ້ຮາກສາມາດແລ່ນສະຄິບ, ເພາະສະນັ້ນຈຶ່ງມີຂໍ້ຜິດພາດທີ່ມີເຫດຜົນ.

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

    ໝາຍ ເຫດ: ດັ່ງທີ່ພວກເຮົາໄດ້ເບິ່ງໄປກ່ອນ ໜ້າ ນີ້ໃນຊ່ວງເລີ່ມຕົ້ນຂອງຊຸດນີ້, ຄຳ ສັ່ງທີ່ມີການຕິດຕັ້ງແກະສາມາດກະຕຸ້ນການແກ້ໄຂໃນສ່ວນໃດ ໜຶ່ງ ຂອງສະຄິບແກະ.

    ດັ່ງນັ້ນ, ເສັ້ນຂ້າງລຸ່ມນີ້ຈະຊ່ວຍໃຫ້ພວກເຮົາພົບເຫັນຂໍ້ຜິດພາດທີ່ມີເຫດຜົນນີ້ໃນ ໜ້າ ທີ່ໂດຍການຕິດຕາມການປະຕິບັດຂອງມັນ:

    ສະຄິບທີ່ມີຂໍ້ຜິດພາດທີ່ມີເຫດຜົນ:

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

    ບັນທຶກເອກະສານດັ່ງກ່າວແລະຮຽກຮ້ອງສະຄິບ, ພວກເຮົາສາມາດເຫັນໄດ້ວ່າຜູ້ໃຊ້ລະບົບປົກກະຕິສາມາດແລ່ນສະຄິບໂດຍບໍ່ມີການ sudo ຄືກັບຢູ່ໃນຜົນຜະລິດຂ້າງລຸ່ມ. ນີ້ແມ່ນຍ້ອນວ່າມູນຄ່າຂອງ USER_ID ແມ່ນ 100 ເຊິ່ງບໍ່ເທົ່າກັບ ROOT_ID ຮາກເຊິ່ງເປັນ 0.

    $ ./sys_info.sh
    

    ດີ, ນັ້ນແມ່ນມັນ ສຳ ລັບດຽວນີ້, ພວກເຮົາໄດ້ມາຮອດຕອນສຸດທ້າຍຂອງ ໜັງ ສືແກະສະຫຼັກແກະ, ຮູບແບບການຕອບສະ ໜອງ ຕໍ່ໄປນີ້ສາມາດຖືກ ນຳ ໃຊ້ເພື່ອຕອບ ຄຳ ຖາມຫລື ຄຳ ຕິຊົມໃດໆຕໍ່ພວກເຮົາ, ກ່ຽວກັບ ຄຳ ແນະ ນຳ ນີ້ຫຼືຊຸດທັງ ໝົດ 3 ພາກ.