詳解bash中的腳本調(diào)試機(jī)制
以調(diào)試模式運(yùn)行腳本
通過(guò)bash -x <script>的方式可以在調(diào)試模式下運(yùn)行整個(gè)腳本, bash會(huì)在在運(yùn)行前打印出了每一行命令, 而且每行前面用+號(hào)表明命令的嵌套層數(shù).
> bash -x debug.sh + echo 'First line' First line # 輸出結(jié)果沒(méi)有加號(hào) ++ date # 先執(zhí)行命令替換 兩個(gè)加號(hào)是因?yàn)樵撁钋短自趀cho中 + 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ù)雜, 我們可以通過(guò)使用環(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)錯(cuò)誤時(shí)執(zhí)行預(yù)設(shè)的操作, 例如打印出錯(cuò)的命令:
trap 'echo $BASH_COMMAND' ERR
但鑒于使用trap進(jìn)行調(diào)試的執(zhí)行效率過(guò)低, 建議在較為復(fù)雜的腳本中直接使用調(diào)試選項(xiàng)或者使用bashdb等調(diào)試工具.
高級(jí)調(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)用 否則無(wú)輸出
exit 0
運(yùn)行該腳本可以得到以下輸出:
Level0 11 func2 call.sh # func1 的直接調(diào)用者
Level1 15 func3 call.sh # 一層間接調(diào)用
Level2 18 main call.sh # 二層間接調(diào)用
Level3 # 無(wú)輸出 因?yàn)闆](méi)有第三層調(diào)用
局部調(diào)試
可以通過(guò)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ù)表
| 短命令 | 長(zhǎng)命令 | 效果 |
|---|---|---|
| set -f | set -o noglob | 對(duì)文件名停用元字符匹配 |
| set -v | set -o verbose | 打印輸入的命令 |
| set -x | set -o xtrace | 命令行首打印+,執(zhí)行出錯(cuò)會(huì)打印詳細(xì)信息 |
調(diào)試用的參數(shù)可以在運(yùn)行中動(dòng)態(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
通過(guò)使用-f選項(xiàng)可以顯著減少腳本中的轉(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 # 選項(xiàng) x 還可以用于顯示詳細(xì)錯(cuò)誤信息 > 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)試模式啟動(dòng):
#!/bin/bash -xv
還可以在可能出錯(cuò)的命令前用echo輸出調(diào)試信息:
echo "debug message: now attempting to start w command"; w # 用 ; 對(duì)要執(zhí)行的命令排序 echo "Variable VARNAME is now set to $VARNAME."
設(shè)置選項(xiàng)輔助調(diào)試
為了方便調(diào)試,我們可以使用set命令對(duì)bash的選項(xiàng)進(jìn)行設(shè)置:
> set -o # 查看所有選項(xiàng)的開(kāi)關(guān)狀態(tài) > set -o | grep xtrace xtrace off > set -x # 等價(jià)于 set -o xtrace > set -o | grep xtrace + grep --color=auto xtrace + set -o xtrace on > set +x # 等價(jià)于 set +o xtrace + set +x > set -o | grep xtrace xtrace off
常用調(diào)試選項(xiàng)
引用為定義變量時(shí)報(bào)錯(cuò):
> unset $VAR;echo $VAR > set -u # 等價(jià)于 set -o nounset > echo $var bash: var: unbound variable
為防止誤操作覆蓋文件中的數(shù)據(jù), 設(shè)置禁止重定向到已經(jīng)存在的文件:
> set -C # 等價(jià)于 set -o noclobber > touch test > date > test bash: test: cannot overwrite existing file
設(shè)置不解析通配符:
> set -f # 等價(jià)于 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用批處理腳本在特定目錄中啟動(dòng)Git-Bash窗口
- 處理Shell腳本中帶有空格的變量(bash腳本)
- Bash 腳本實(shí)現(xiàn)每次登錄到 Shell 時(shí)可以查看 Linux 系統(tǒng)信息
- 如何利用Bash腳本監(jiān)控Linux的內(nèi)存使用情況
- bash腳本中將密碼傳遞給ssh/scp命令方法詳解
- linux Bash腳本判別使用者的身份方法示例
- 詳解shell中source、sh、bash、./執(zhí)行腳本的區(qū)別
- linux bash腳本監(jiān)控啟動(dòng)停止weblogic服務(wù)的腳本寫(xiě)法
- 如何寫(xiě)出安全的、基本功能完善的Bash腳本
相關(guān)文章
Linux利用inotify和rsync服務(wù)實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)同步的原理解析
inotify是系統(tǒng)內(nèi)核的一個(gè)監(jiān)控服務(wù),屬于操作系統(tǒng)內(nèi)核的一個(gè)特有機(jī)制,用于監(jiān)控文件的信息變化,這篇文章主要介紹了Linux利用inotify和rsync服務(wù)實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)同步,需要的朋友可以參考下2022-10-10
CentOS 6.4安裝配置LNMP服務(wù)器(Nginx+PHP+MySQL)
這篇文章主要介紹了CentOS 6.4下配置LNMP服務(wù)器的詳細(xì)步驟,需要的朋友可以參考下2013-06-06
Linux實(shí)現(xiàn)科學(xué)上網(wǎng)
本文給大家介紹的是Linux下使用plink ssh + privoxy 實(shí)現(xiàn)局域網(wǎng)共享代理,非常的全面細(xì)致,這里推薦給大家。2015-03-03
Yum中報(bào)錯(cuò):“pycurl.so: undefined symbol: CRYPTO_num_locks”的問(wèn)題排查
這篇文章主要給大家介紹了在Yum中報(bào)錯(cuò): "pycurl.so: undefined symbol: CRYPTO_num_locks"的問(wèn)題排查的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-06
FOXHIS西軟系統(tǒng)sybase提示通知空間不足處理方法
各位酒店的電腦房經(jīng)理有沒(méi)有經(jīng)歷過(guò)在如下圖這樣的錯(cuò)誤?有時(shí)候酒店的維護(hù)費(fèi)沒(méi)有到位或者時(shí)間急迫的時(shí)候我們需要自己的操作,操作步驟如下文所述2017-01-01
CentOS配置本地yum源/阿里云yum源/163yuan源并配置yum源的優(yōu)先級(jí)
這篇文章主要介紹了CentOS配置本地yum源/阿里云yum源/163yuan源并配置yum源的優(yōu)先級(jí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
vim學(xué)習(xí)高級(jí)技巧之序列的生成方法詳解
Vim經(jīng)過(guò)了這么多年的發(fā)展,已經(jīng)是世界上最強(qiáng)悍的編輯器之一,這篇文章主要給大家介紹了關(guān)于vim高級(jí)學(xué)習(xí)技巧之序列生成的相關(guān)資料,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09
Linxu下性能指標(biāo)采集工具之nmon工具的使用
Linux下查看CPU信息一般采用top命令來(lái)實(shí)時(shí)觀(guān)察,但是這種對(duì)于只是通過(guò)觀(guān)察數(shù)據(jù)的變化來(lái)評(píng)估cpu的實(shí)時(shí)情況顯然不太科學(xué)。如果想要通過(guò)圖標(biāo)的形式來(lái)表現(xiàn)則需要借助一些外部工具,今天就來(lái)講解一下nmon工具的使用2023-04-04

