Shell 腳本調(diào)試的主要工作是發(fā)現(xiàn)腳本的錯誤的原因噩翠,以及定位腳本中發(fā)生錯誤的行胆剧。Bash 提供了多種腳本調(diào)試的功能奴紧。但是比較常用的是使用 Bash 的 -x 選項啟動一個子 Shell诽偷,它將以調(diào)試模式運行整個腳本侈净,使 Shell 在執(zhí)行腳本的過程中把實際執(zhí)行的每一個命令行顯示出來,并且在命令行的行首顯示一個 “+” 號编曼,“+” 號后面顯示的是經(jīng)過了參數(shù)擴展的命令行的內(nèi)容豆巨。這將有助于分析實際執(zhí)行的是什么命令。
Bash 的執(zhí)行選項還可以在腳本中通過 let 命令來指定掐场⊥樱“set -選項”表示啟動某選項,“set +選項”表示關(guān)閉某選項熊户。所以我們可以在 Shell 腳本中使用 “set -x” 和 “set +x” 命令來調(diào)試腳本中的某一段代碼萍膛。
Bash 中還有一個 “-v” 選項,該選項將激活詳細輸出模式嚷堡,在這一模式中蝗罗,由 Bash 讀入的每一行命令都將在執(zhí)行前被打印,包括注釋行蝌戒。
定制輸出信息
$LINENO —— Bash 內(nèi)部環(huán)境變量串塑,表示 Shell 腳本的當前行號。
$FUNCNAME —— Bash 內(nèi)部環(huán)境變量瓶颠,它是一個包含了當前在執(zhí)行調(diào)用堆棧中的所有 Shell 函數(shù)名稱的數(shù)組變量拟赊。${FUNCNAME[0]} 代表當前正在執(zhí)行的 Shell 函數(shù)的名稱,${FUNCNAME[1]} 則代表調(diào)用函數(shù)
${FUNCNAME[0]} 的函數(shù)的名字粹淋,依次類推吸祟。
$PS4 —— Bash 內(nèi)部環(huán)境變量瑟慈,在使用 Bash 的 -x 選項時,每一條實際執(zhí)行的命令的行首會顯示一個 “+” 號屋匕,這個 “+” 號其實就是變量 $PS4 的默認值葛碧。
利用 $PS4 變量,再結(jié)合 $LINENO 和 $FUNCNAME 兩個內(nèi)部變量过吻,通過重新定義變量 $PS4进泼,可以增強 -x 選項的輸出信息。我們可以在執(zhí)行腳本之前先執(zhí)行下面的語句:
export PS4=`+{$LINENO:${FUNCNAME[0]}}`
使用示例:
Bash 中還有一個執(zhí)行選項 -n纤虽,他可以用于測試 Shell 腳本中是否存在語法錯誤乳绕,它會讀取腳本中的命令行但是不會執(zhí)行它們。
本文參考自 《Linux Shell命令行及腳本編程實例詳解 》