服務(wù)器
以調(diào)試模式運行腳本
通過bash -x <script>的方式可以在調(diào)試模式下運行整個腳本, bash會在在運行前打印出了每一行命令, 而且每行前面用+號表明命令的嵌套層數(shù).
> bash -x debug.sh + echo \'First line\' First line # 輸出結(jié)果沒有加號 ++ date # 先執(zhí)行命令替換 兩個加號是因為該命令嵌套在echo中 + echo \'Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done.\' Print datetime: Thu 26 Mar 2020 08:21:28 PM CST Done.
如果腳本比較復(fù)雜, 我們可以通過使用環(huán)境變量PS4配合調(diào)試用的內(nèi)置變量用于輸出更加詳細(xì)的信息:
> export PS4=\'+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: \' > bash -x debug.sh +debug.sh:3:: echo \'First line\' First line ++debug.sh:4:: date +debug.sh:4:: echo \'Print datetime: Thu 26 Mar 2020 08:35:59 PM CST Done.\' Print datetime: Thu 26 Mar 2020 08:35:59 PM CST Done.
我們也可以使用trap的DEBUG關(guān)鍵字在解釋執(zhí)行每一行腳本之前執(zhí)行指定的命令或函數(shù):
trap \'echo VARIABLE-TRACE> \\$variable = \\$variable\\\' DEBUG variable=29 let variable++ let variable*=5 exit 0 # 輸出如下 VARIABLE-TRACE> $variable = VARIABLE-TRACE> $variable = 29 VARIABLE-TRACE> $variable = 30 VARIABLE-TRACE> $variable = 150
還可以使用trap的ERR關(guān)鍵字用于在解釋出現(xiàn)錯誤時執(zhí)行預(yù)設(shè)的操作, 例如打印出錯的命令:
trap \'echo $BASH_COMMAND\' ERR
但鑒于使用trap進(jìn)行調(diào)試的執(zhí)行效率過低, 建議在較為復(fù)雜的腳本中直接使用調(diào)試選項或者使用bashdb等調(diào)試工具.
高級調(diào)試
查看函數(shù)調(diào)用信息
在函數(shù)中使用內(nèi)置命令caller能夠把函數(shù)的調(diào)用信息輸出到stdout, 但要注意該命令必須在函數(shù)內(nèi)部調(diào)用.
#!/usr/bin/bash func1 () { for i in `seq 0 3` do echo -e Level$i\\t `caller $i` done } func2 () { func1 } func3 () { func2 } func3 caller 0 # 必須在函數(shù)中調(diào)用 否則無輸出 exit 0
運行該腳本可以得到以下輸出:
Level0 11 func2 call.sh # func1 的直接調(diào)用者
Level1 15 func3 call.sh # 一層間接調(diào)用
Level2 18 main call.sh # 二層間接調(diào)用
Level3 # 無輸出 因為沒有第三層調(diào)用
局部調(diào)試
可以通過set命令構(gòu)造局部調(diào)試塊,我們可以按照如下方式添加局部調(diào)試:
set -x date set +x
> bash script1.sh # 不需要添加調(diào)試參數(shù) The script starts now. + date Fri 28 Feb 2020 06:23:04 PM CST + set +x This is a string: black And this is a number: 9
調(diào)試參數(shù)表
短命令
長命令
效果
set -f
set -o noglob
對文件名停用元字符匹配
set -v
set -o verbose
打印輸入的命令
set -x
set -o xtrace
命令行首打印+,執(zhí)行出錯會打印詳細(xì)信息
調(diào)試用的參數(shù)可以在運行中動態(tài)疊加或刪除:
> set -v > date date Fri 28 Feb 2020 06:54:47 PM CST > set -x # 參數(shù)可以累加 date # -v 的效果 + date # -x 的效果 Fri 28 Feb 2020 06:55:37 PM CST > set +vx # 取消參數(shù) set +vx
通過使用-f選項可以顯著減少腳本中的轉(zhuǎn)義字符:
> ls ? x86_64-pc-linux-gnu-library > set -f # 停用元字符匹配 > ls ? ls: cannot access \'?\': No such file or directory > touch ? > ls ? \'?\' > rm ? > set +f -x # 選項 x 還可以用于顯示詳細(xì)錯誤信息 > aaa + aaa + \'[\' -x /usr/lib/command-not-found \']\' + /usr/lib/command-not-found -- aaa Command \'aaa\' not found, did you mean: command \'aha\' from deb aha (0.5-1) command \'jaaa\' from deb jaaa (0.8.4-4) command \'aa\' from deb astronomical-almanac (5.6-6) Try: sudo apt install <deb name> + return 127
默認(rèn)調(diào)試
也可以直接在腳本第一行添加參數(shù)讓腳本默認(rèn)以調(diào)試模式啟動:
#!/bin/bash -xv
還可以在可能出錯的命令前用echo輸出調(diào)試信息:
echo debug message: now attempting to start w command; w # 用 ; 對要執(zhí)行的命令排序 echo Variable VARNAME is now set to $VARNAME.
設(shè)置選項輔助調(diào)試
為了方便調(diào)試,我們可以使用set命令對bash的選項進(jìn)行設(shè)置:
> set -o # 查看所有選項的開關(guān)狀態(tài) > set -o | grep xtrace xtrace off > set -x # 等價于 set -o xtrace > set -o | grep xtrace + grep --color=auto xtrace + set -o xtrace on > set +x # 等價于 set +o xtrace + set +x > set -o | grep xtrace xtrace off
常用調(diào)試選項
引用為定義變量時報錯:
> unset $VAR;echo $VAR > set -u # 等價于 set -o nounset > echo $var bash: var: unbound variable
為防止誤操作覆蓋文件中的數(shù)據(jù), 設(shè)置禁止重定向到已經(jīng)存在的文件:
> set -C # 等價于 set -o noclobber > touch test > date > test bash: test: cannot overwrite existing file
設(shè)置不解析通配符:
> set -f # 等價于 set -o noglob > touch * > ll * -rw-rw-r-- 1 remilia remilia 0 Mar 1 20:09 \'*\'
到此這篇關(guān)于詳解bash中的腳本調(diào)試機(jī)制的文章就介紹到這了,更多相關(guān)bash 腳本調(diào)試 內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!
文章名稱:詳解bash中的腳本調(diào)試機(jī)制
轉(zhuǎn)載來源:http://www.rwnh.cn/article32/chcgsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、品牌網(wǎng)站設(shè)計、營銷型網(wǎng)站建設(shè)、服務(wù)器托管、網(wǎng)站改版、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)