自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在Shell腳本中跟蹤調(diào)試命令的執(zhí)行

系統(tǒng) Linux
在 shell 腳本調(diào)試系列 中,本文將解釋第三種 shell 腳本調(diào)試模式,即 shell 跟蹤,并查看一些示例來演示它如何工作以及如何使用它。

[[182102]]

在 shell 腳本調(diào)試系列 中,本文將解釋第三種 shell 腳本調(diào)試模式,即 shell 跟蹤,并查看一些示例來演示它如何工作以及如何使用它。

本系列的前面部分清晰地闡明了另外兩種 shell 腳本調(diào)試模式:詳細(xì)模式和語法檢查模式,并用易于理解的例子展示了如何在這些模式下啟用 shell 腳本調(diào)試。

  1. 如何在 Linux 中啟用 Shell 腳本的調(diào)試模式
  2. 如何在 Shell 腳本中執(zhí)行語法檢查調(diào)試模式

shell 跟蹤簡單的來說就是跟蹤 shell 腳本中的命令的執(zhí)行。要打開 shell 跟蹤,請使用 -x 調(diào)試選項(xiàng)。

這會(huì)讓 shell 在終端上顯示所有執(zhí)行的命令及其參數(shù)。

我們將使用下面的 sys_info.sh shell 腳本,它會(huì)簡要地打印出你的系統(tǒng)日期和時(shí)間、登錄的用戶數(shù)和系統(tǒng)的運(yùn)行時(shí)間。不過,腳本中包含我們需要查找和更正的語法錯(cuò)誤。

  1. #!/bin/bash 
  2. # script to print brief system info 
  3. ROOT_ID="0" 
  4. DATE=`date
  5. NO_USERS=`who | wc -l` 
  6. UPTIME=`uptime` 
  7. check_root(){ 
  8.   if [ "$UID" -ne "$ROOT_ID" ]; then 
  9.     echo "You are not allowed to execute this program!" 
  10.     exit 1;     
  11. print_sys_info(){ 
  12.   echo "System Time    : $DATE" 
  13.   echo "Number of users: $NO_USERS" 
  14.   echo "System Uptime  : $UPTIME 
  15. check_root 
  16. print_sys_info 
  17. exit 0 

保存文件并執(zhí)行腳本。腳本只能用 root 用戶運(yùn)行,因此如下使用 sudo 命令運(yùn)行:

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

shell 跟蹤 - 顯示腳本中的錯(cuò)誤 

shell 跟蹤 - 顯示腳本中的錯(cuò)誤

從上面的輸出我們可以觀察到,首先執(zhí)行命令,然后其輸出做為一個(gè)變量的值。

例如,先執(zhí)行 date,其輸出做為變量 DATE 的值。

我們可以執(zhí)行語法檢查來只顯示其中的語法錯(cuò)誤,如下所示:

  1. $ sudo bash -n sys_info.sh  

 

 

腳本中語法檢查 

腳本中語法檢查

如果我們審視這個(gè) shell 腳本,我們就會(huì)發(fā)現(xiàn) if 語句缺少了封閉條件的 fi 關(guān)鍵字。因此,讓我們加上它,新的腳本應(yīng)該看起來像這樣:

  1. #!/bin/bash 
  2. #script to print brief system info 
  3. ROOT_ID="0" 
  4. DATE=`date
  5. NO_USERS=`who | wc -l` 
  6. UPTIME=`uptime` 
  7. check_root(){ 
  8.   if [ "$UID" -ne "$ROOT_ID" ]; then 
  9.     echo "You are not allowed to execute this program!" 
  10.     exit 1; 
  11.   fi     
  12. print_sys_info(){ 
  13.   echo "System Time    : $DATE"  
  14.   echo "Number of users: $NO_USERS" 
  15.   echo "System Uptime  : $UPTIME 
  16. check_root 
  17. print_sys_info 
  18. exit 0 

再次保存文件并以 root 執(zhí)行,同時(shí)做語法檢查: 

  1. $ sudo bash -n sys_info.sh  

在 shell 腳本中執(zhí)行語法檢查 

在 shell 腳本中執(zhí)行語法檢查

上面的語法檢查操作的結(jié)果仍然顯示在腳本的第 21 行還有一個(gè)錯(cuò)誤。所以,我們?nèi)匀灰m正一些語法。

再一次分析腳本,會(huì)發(fā)現(xiàn)第 21 行的錯(cuò)誤是由于在 print_sys_info 函數(shù)內(nèi)***一個(gè) echo 命令中沒有閉合雙引號(hào) "。

我們將在 echo 命令中添加閉合雙引號(hào)并保存文件。修改過的腳本如下:

  1. #!/bin/bash 
  2. #script to print brief system info 
  3. ROOT_ID="0" 
  4. DATE=`date
  5. NO_USERS=`who | wc -l` 
  6. UPTIME=`uptime` 
  7. check_root(){ 
  8.   if [ "$UID" -ne "$ROOT_ID" ]; then 
  9.     echo "You are not allowed to execute this program!" 
  10.     exit 1; 
  11.   fi 
  12. print_sys_info(){ 
  13.   echo "System Time    : $DATE" 
  14.   echo "Number of users: $NO_USERS" 
  15.   echo "System Uptime  : $UPTIME" 
  16. check_root 
  17. print_sys_info 
  18. exit 0 

現(xiàn)在再一次檢查語法。

  1. $ sudo bash -n sys_info.sh 

上面的命令不會(huì)產(chǎn)生任何輸出,因?yàn)槲覀兊哪_本語法上正確。我們也可以再次跟蹤腳本執(zhí)行,它應(yīng)該工作得很好:

  1. $ sudo bash -x sys_info.sh  

 

 

跟蹤 shell 腳本執(zhí)行 

跟蹤 shell 腳本執(zhí)行

現(xiàn)在運(yùn)行腳本。

  1. $ sudo ./sys_info.sh  

 

 

用 shell 腳本顯示日期、時(shí)間和運(yùn)行時(shí)間 

用 shell 腳本顯示日期、時(shí)間和運(yùn)行時(shí)間

shell 跟蹤執(zhí)行的重要性

shell 腳本跟蹤可以幫助我們識(shí)別語法錯(cuò)誤,更重要的是識(shí)別邏輯錯(cuò)誤。例如,在 sys_info.sh shell 腳本中的 check_root 函數(shù),它用于確定用戶是否為 root,因?yàn)槟_本只允許由超級(jí)用戶執(zhí)行。

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

這里的魔法是由 if 語句表達(dá)式 ["$ UID" -ne "$ ROOT_ID"] 控制的,一旦我們不使用合適的數(shù)字運(yùn)算符(示例中為 -ne,這意味著不相等),我們最終可能會(huì)出一個(gè)邏輯錯(cuò)誤。

假設(shè)我們使用 -eq (意思是等于),這將允許任何系統(tǒng)用戶以及 root 用戶運(yùn)行腳本,因此是一個(gè)邏輯錯(cuò)誤。

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

注意:我們在本系列開頭介紹過,set 這個(gè) shell 內(nèi)置命令可以在 shell 腳本的特定部分激活調(diào)試。

因此,下面的行將幫助我們通過跟蹤腳本的執(zhí)行在其中找到這個(gè)邏輯錯(cuò)誤:

具有邏輯錯(cuò)誤的腳本:

  1. #!/bin/bash 
  2. #script to print brief system info 
  3. ROOT_ID="0" 
  4. DATE=`date
  5. NO_USERS=`who | wc -l` 
  6. UPTIME=`uptime` 
  7. check_root(){ 
  8.   if [ "$UID" -eq "$ROOT_ID" ]; then 
  9.     echo "You are not allowed to execute this program!" 
  10.     exit 1; 
  11.   fi 
  12. print_sys_info(){ 
  13.   echo "System Time    : $DATE" 
  14.   echo "Number of users: $NO_USERS" 
  15.   echo "System Uptime  : $UPTIME" 
  16. #turning on and off debugging of check_root function 
  17. set -x ; check_root;  set +x ; 
  18. print_sys_info 
  19. exit 0 

保存文件并調(diào)用腳本,在輸出中,我們可以看到一個(gè)普通系統(tǒng)用戶可以在未 sudo 的情況下運(yùn)行腳本。 這是因?yàn)?USER_ID 的值為 100,不等于為 0 的 root 的 ROOT_ID 。

  1. $ ./sys_info.sh  

 

 

Run Shell Script Without Sudo 

Run Shell Script Without Sudo

未 sudo 的情況下運(yùn)行 shell 腳本

那么,現(xiàn)在我們已經(jīng)完成了 shell 腳本調(diào)試系列,可以在下面的反饋欄里給我們關(guān)于本篇或者本系列提出問題或反饋。

作者簡介: 

 

 

[[182103]]

Aaron Kili 是 Linux 和 F.O.S.S 愛好者,將來的 Linux SysAdmin、web 開 發(fā)人員,目前是 TecMint 的內(nèi)容創(chuàng)作者,他喜歡用電腦工作,并堅(jiān)信分享知識(shí)。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2016-12-20 09:30:22

shell腳本linux

2016-12-16 09:23:29

LinuxShell腳本

2018-02-01 17:32:30

LinuxUNIXBash Shell

2021-08-30 07:50:42

腳本語言命令行

2011-07-25 16:03:47

XCode 編譯

2021-01-18 17:23:30

代碼調(diào)試VS Code

2023-04-04 07:52:26

RedisLua腳本

2021-04-21 08:03:34

腳本Shell讀取

2021-08-20 10:46:25

Shell腳本文件Linux

2020-12-14 06:57:37

shell

2017-03-10 10:37:16

Linux命令腳本

2020-06-04 17:00:37

Linux命令腳本

2022-11-23 08:14:42

bash 腳本test 命令

2012-05-08 11:11:43

Linuxcrontab命令

2022-12-22 20:47:01

腳本循環(huán)結(jié)構(gòu)

2021-03-14 09:28:24

Linux Shell腳本

2022-10-09 10:18:44

LinuxShell腳本

2024-05-31 12:54:37

.NET CoreLinux語言

2021-01-12 10:10:41

shell腳本Linux命令

2021-01-08 08:06:19

腳本Shell文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)