使用sh x除錯shell指令碼

2021-07-15 14:40:02 字數 1396 閱讀 3928

使用sh -x除錯shell指令碼

通過1.加入echo或者使用

2.-x選項,輕鬆跟蹤除錯shell指令碼

[以下字段**:

"-x"選項可用來跟蹤指令碼的執行,是除錯shell指令碼的強有力工具。「-x」選項使shell在執行指令碼的過程中把它實際執行的每乙個命令列顯示出來,並且在行首顯示乙個"+"號。 "+"號後面顯示的是經過了變數替換之後的命令列的內容,有助於分析實際執行的是什麼命令。 「-x」選項使用起來簡單方便,可以輕鬆對付大多數的shell除錯任務,應把其當作首選的除錯手段。

shell的執行選項除了可以在啟動shell時指定外,亦可在指令碼中用set命令來指定。 "set -引數"表示啟用某選項,"set +引數"表示關閉某選項。有時候我們並不需要在啟動時用"-x"選項來跟蹤所有的命令列,這時我們可以在指令碼中使用set命令,如以下指令碼片段所示:

set -x    #啟動"-x"選項 要跟蹤的程式段 set +x     #關閉"-x"選項

set命令同樣可以使用上一節中介紹的除錯鉤子—debug函式來呼叫,這樣可以避免指令碼交付使用時刪除這些除錯語句的麻煩,如以下指令碼片段所示:

debug set -x    #啟動"-x"選項 要跟蹤的程式段 debug set +x    #關閉"-x"選項

對"-x"選項的增強

"-x"執行選項是目前最常用的跟蹤和除錯shell指令碼的手段,但其輸出的除錯資訊僅限於進行變數替換之後的每一條實際執行的命令以及行首的乙個"+"號提示符,居然連行號這樣的重要資訊都沒有,對於複雜的shell指令碼的除錯來說,還是非常的不方便。幸運的是,我們可以巧妙地利用shell內建的一些環境變數來增強"-x"選項的輸出資訊,下面先介紹幾個shell內建的環境變數:

$lineno

代表shell指令碼的當前行號,類似於c語言中的內建巨集__line__

$funcname

函式的名字,類似於c語言中的內建巨集__func__,但巨集__func__ 只能代表當前所在的函式名,而$funcname的功能更強大,它是乙個陣列變數,其中包含了整個呼叫鏈上所有的函式的名字,故變數$代表shell指令碼當前正在執行的函式的名字,而變數$則代表呼叫函式$的函式的名字,餘者可以依此類推。

$ps4

主提示符變數$ps1和第二級提示符變數$ps2比較常見,但很少有人注意到第四級提示符變數$ps4的作用。我們知道使用「-x」執行選項將會顯示shell指令碼中每一條實際執行過的命令,而$ps4的值將被顯示在「-x」選項輸出的每一條命令的前面。在bash shell中,預設的$ps4的值是"+"號。(現在知道為什麼使用"-x"選項時,輸出的命令前面有乙個"+"號了吧?)。

利用$ps4這一特性,通過使用一些內建變數來重定義$ps4的值,我們就可以增強"-x"選項的輸出信 息。例如先執行export ps4='+} ', 然後再使用「-x」選項來執行指令碼,就能在每一條實際執行的命令前面顯示其行號以及所屬的函式名。

Shell 指令碼除錯

除錯功能是每一門程式語言都應該實現的重要特性,每個系統程式設計師都應該了解bash的除錯選項 1.使用選項 x,啟動shell指令碼的跟蹤除錯功能,將執行的每一條命令和輸出的結果輸出 test.sh檔案 bin bash foriin do echo i done echo script execu...

除錯shell指令碼

遇見莫名其妙的錯誤,先dos2uinux指令碼。echo命令是最有用的除錯指令碼工具之一。一般在可能出現問題的指令碼前後加入echo命令 使用bash命令引數進行除錯 引數 n 不會執行該指令碼,僅查詢指令碼語法是否有問題,並給出錯誤提示。v 在執行指令碼時,先將指令碼的內容輸出到螢幕上然後執行指令...

shell 指令碼除錯

發表於 2016 4 27 0 03 30 1693 人閱讀 分類 shell 除錯功能是每一門程式語言都應該實現的重要特性,每個系統程式設計師都應該了解bash的除錯選項 1.使用選項 x,啟動shell指令碼的跟蹤除錯功能,將執行的每一條命令和輸出的結果輸出 test.sh檔案 bin bash...