如何除錯bash指令碼

2021-06-02 05:23:39 字數 2700 閱讀 3445

bash 是linux作業系統的預設shell指令碼。shell是用來處理作業系統和使用者互動的乙個程式。shell的指令碼可以幫助使用者自動化地和作業系統進行互動。你也可以理解為一種指令碼式的程式設計。即然有程式設計,那麼,程式的編譯器,直譯器,偵錯程式就必不可少了,bash也一樣,但在除錯方面可能會有一些和程式語言不一樣的東西和技術,所以,下面這篇文章主要是說明除錯bash指令碼的各種技術。

跟蹤指令碼的執行

你可以讓bash列印出你指令碼執行的過程中的所有語句。這很簡單,只需要使用bash的-x選項就可以做到,下面讓我們來看一下。

view plain

print?

#!/bin/bash

echo "hello $user,"

echo "today is $(date +'%y-%m-%d')"

下面讓我們使用-x選項來執行這段指令碼:

view plain

print?

$ bash -x example_script.sh  

+ echo 'hello chenhao,'

hello chenhao,  

++ date +%y-%m-%d  

+ echo 'today is 2009-08-31'

today is 2009-08-31  

這時,我們可以看到,bash在執行前列印出了每一行命令。而且每行前面的+號表明了巢狀。這樣的輸出可以讓你看到命令執行的順序並可以讓你知道整個指令碼的行為。

在跟蹤裡輸出行號

exportps4='+$:$:$: '

讓我們看看設定上了ps4這個環境變數後會是什麼樣的輸出。

$bash-x example_script.sh

+example_script.sh:2::echo'hello chenhao,'

hello chenhao,

++example_script.sh:3::date+%y-%m-%d

+example_script.sh:3::echo'today is 2009-08-31'

today is 2009-08-31

除錯部份的指令碼

有些時候,你並不想除錯整個指令碼,你只要除錯其中的一部份,那麼,你可以在你想要除錯的指令碼之前,呼叫「set -x」,結束的時候呼叫「set +x」就可以了。如下面的指令碼所示:

view plain

print?

#!/bin/bash

echo "hello $user,"

set -x  

echo "today is $(date %y-%m-%d)"

set +x  

讓我們看看執行起來是啥樣?

$ ./example_script.sh

hello chenhao,

++example_script.sh:4::date+%y-%m-%d

+example_script.sh:4::echo'today is 2009-08-31'

today is 2009-08-31

+example_script.sh:5::set+x

注意:我們在執行指令碼的時候,不需要使用bash -x了。

日誌輸出

跟蹤日誌有時候太多了,多得都受不了,而且,輸出的內容很難閱讀。一般來說,我們很多時候只關心於條件表示式,變數值,或是函式呼叫,或是迴圈等。。在這種情況下,log一些感興趣的特定的資訊,可能會更好。

使用log前,我們先寫乙個函式:

view plain

print?

_log()   

於是,你就可以在你的指令碼中如下使用:

_log"copying files..."

cpsrc/* dst/

我們可以看到,上面那個_log函式,需要檢查乙個_debug 變數,只有這個變數是真,才會真正開發輸出日誌。這樣,你就只需要控制這個開關,而不需要刪除你的debug資訊。

$ _debug=true./example_script.sh

使用bash專用偵錯程式

如果你在寫乙個相當複雜的指令碼,並且,你需要乙個完整的像除錯別的語言一樣的偵錯程式,那麼你可以試著用用這個開源軟體—— bashdb , 乙個bash的專用偵錯程式。這個偵錯程式很強大,你想得到的功能,他都有,比如,設定斷點,單步跟蹤,跳出函式,等等。它的使用者介面很想gdb,這是他的文件 。

Bash 指令碼除錯

大神 bash是unix linux作業系統最常用的shell之一,它非常靈活,和awk c 配合起來異常強大 以下使用乙個測試指令碼來說明使用bash除錯的方法 test.sh bin bash echo begin awk end test.sh max 3 for i 0 i max i do...

如何除錯bash指令碼 codestorm 新浪部落格

bash 是linux作業系統的預設shell指令碼。shell是用來處理作業系統和使用者互動的乙個程式。shell的指令碼可以幫助使用者自動化地和作業系統進行互動。你也可以理解為一種指令碼式的程式設計。即然有程式設計,那麼,程式的編譯器,直譯器,偵錯程式就必不可少了,bash也一樣,但在除錯方面可...

bash指令碼除錯方法

本文全面系統地介紹了shell指令碼除錯技術,包括使用echo,tee,trap等命令輸出關鍵資訊,跟蹤變數的值,在指令碼中植入除錯鉤子,使用 n 選項進行shell指令碼的語法檢查,使用 x 選項實現shell指令碼逐條語句的跟蹤,巧妙地利用shell的內建變數增強 x 選項的輸出資訊等。一.前言...