ວິທີການຕິດຕາມການປະຕິບັດຂອງ ຄຳ ສັ່ງໃນ Shell Script ດ້ວຍ Shell Tracing
ໃນບົດຂຽນນີ້ຂອງຊຸດ shell script debugging, ພວກເຮົາຈະອະທິບາຍຮູບແບບການ ກຳ ນົດແກະສະຫຼັກແກະແບບທີສາມ, ນັ້ນແມ່ນການຕິດຕາມຫອຍແລະເບິ່ງບາງຕົວຢ່າງເພື່ອສະແດງວິທີການໃຊ້ງານ, ແລະມັນສາມາດໃຊ້ໄດ້ແນວໃດ.
ສ່ວນກ່ອນ ໜ້າ ນີ້ຂອງຊຸດນີ້ຈະເຮັດໃຫ້ເຫັນແສງສະຫວ່າງທີ່ແຕກຕ່າງກັນສອງຮູບແບບຄື: ໂຫມດ verbose ແລະ ໂໝດ ກວດສອບ syntax ດ້ວຍຕົວຢ່າງທີ່ເຂົ້າໃຈງ່າຍກ່ຽວກັບວິທີການເຮັດໃຫ້ shell shell debugging ໃນຮູບແບບເຫຼົ່ານີ້.
<
ການຫອຍນາງລົມ ໝາຍ ເຖິງການຕິດຕາມການປະຕິບັດ ຄຳ ສັ່ງໃນຫອຍແກະ. ເພື່ອສະຫຼັບການເຈາະຮອຍຫອຍ, ໃຊ້ຕົວເລືອກ 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 ພາກ.