如何调试bash脚本
http://coolshell.cn/articles/1379.html
Bash?是Linux操作系統(tǒng)的默認Shell腳本。Shell是用來處理操作系統(tǒng)和用戶交互的一個程序。Shell的腳本可以幫助用戶自動化地和操作系統(tǒng)進行交互。你也可以理解為一種腳本式的編程。即然有編程,那么,程序的編譯器,解釋器,調(diào)試器就必不可少了,Bash也一樣,但在調(diào)試方面可能會有一些和編程語言不一樣的東西和技術(shù),所以,下面這篇文章主要是說明調(diào)試bash腳本的各種技術(shù)。
跟蹤腳本的執(zhí)行
你可以讓bash打印出你腳本執(zhí)行的過程中的所有語句。這很簡單,只需要使用bash的-x選項就可以做到,下面讓我們來看一下。
下面的這段腳本,先是輸出一個問候語句,然后輸出當前的時間:
| 1 2 3 | #!/bin/bash echo "Hello $USER," echo "Today is $(date +'%Y-%m-%d')" |
下面讓我們使用-x選項來運行這段腳本:
| 1 2 3 4 5 6 | $ 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在運行前打印出了每一行命令。而且每行前面的+號表明了嵌套。這樣的輸出可以讓你看到命令執(zhí)行的順序并可以讓你知道整個腳本的行為。
在跟蹤里輸出行號
在一個很大的腳本中,你會看到很多很多的執(zhí)行跟蹤的輸出,閱讀起來非常費勁,所以,你可以在每一行前加上文件的行號,這會非常有用。要做到這樣,你只需要設(shè)置下面的環(huán)境變量:
| 1 2 | ?? export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: ' |
讓我們看看設(shè)置上了PS4這個環(huán)境變量后會是什么樣的輸出。
?
| 1 2 3 4 5 6 | $ 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 |
?
調(diào)試部份的腳本
有些時候,你并不想調(diào)試整個腳本,你只要調(diào)試其中的一部份,那么,你可以在你想要調(diào)試的腳本之前,調(diào)用“set -x”,結(jié)束的時候調(diào)用“set +x”就可以了。如下面的腳本所示:
?
| 1 2 3 4 5 | #!/bin/bash echo "Hello $USER," set -x echo "Today is $(date %Y-%m-%d)" set +x |
?
讓我們看看運行起來是啥樣?
?
| 1 2 3 4 5 6 | $ ./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了。
?
日志輸出
跟蹤日志有時候太多了,多得都受不了,而且,輸出的內(nèi)容很難閱讀。一般來說,我們很多時候只關(guān)心于條件表達式,變量值,或是函數(shù)調(diào)用,或是循環(huán)等。。在這種情況下,log一些感興趣的特定的信息,可能會更好。
使用log前,我們先寫一個函數(shù):
| 1 2 3 4 5 | _log() { ????if [ "$_DEBUG" == "true" ]; then ????????echo 1>&2 "$@" ????fi } |
?
于是,你就可以在你的腳本中如下使用:
| 1 2 3 | ?? _log "Copying files..." cp src/* dst/ |
?
我們可以看到,上面那個_log函數(shù),需要檢查一個_DEBUG?變量,只有這個變量是真,才會真正開發(fā)輸出日志。這樣,你就只需要控制這個開關(guān),而不需要刪除你的debug信息。
?
| 1 2 | ?? $ _DEBUG=true ./example_script.sh |
?
使用Bash專用調(diào)試器
如果你在寫一個相當復(fù)雜的腳本,并且,你需要一個完整的像調(diào)試別的語言一樣的調(diào)試器,那么你可以試著用用這個開源軟件——?bashdb, 一個Bash的專用調(diào)試器。這個調(diào)試器很強大,你想得到的功能,他都有,比如,設(shè)置斷點,單步跟蹤,跳出函數(shù),等等。它的用戶接口很想GDB,這是他的文檔?。
總結(jié)
以上是生活随笔為你收集整理的如何调试bash脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度神经网络DNN的多GPU数据并行框架
- 下一篇: make 调试和传参