《學習bash》筆記--調試shell程式
在shell中,最簡單的調試助手時輸出語句echo,可以通過把許多echo語句放到代碼中進行調試,但必須花費足夠的時間以定位
要查看的資訊。可能必須通過許多的輸出才能發現要尋找的資訊。
1.set選項最基本的時set -o命令選項,當運行指令碼時,這些選項可以用在命令列上,如下表所示: set -o選項 命令列選項 行為 noexec -n 不運行命令,值檢查語法錯誤 verbose -v 在運行命令前回送它們 xtrace -x 回送進行替換處理後的命令
指令碼a.sh的內容為: set -n
if cd /dev; do
echo "in dev 執行指令碼結果: $ ./a.sh
./a.sh: line 2: syntax error near unexpected token `do'
./a.sh: line 2: `if cd /dev; do'
d
指令碼a.sh的內容為:
set -v
echo "1"
echo "2"
執行指令碼結果: $ ./a.sh
echo "1"
1
echo "2"
2
指令碼a.sh的內容為:
set -x
echo "$PWD" 執行指令碼結果: ++ echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
-x選項將回送經過參數替換、命令替換和其他命令列處理步驟後得到的命令列結果。 x選項在每一行開始都列印+,(但是不知道為什麼我這邊列印了2個),這實際上可以定製的,它是內建變數shell變數PS4的值。可以通過修改PS4的值來修改這個符號。例如指令碼a.sh的內容如下: PS4="debug->"
set -x
echo "$PWD"
執行結果: $ ./a.sh
ddebug->echo /home/yanwenjie/bashtest
/home/yanwenjie/bashtest
(不知道為什麼這邊出現了2個d。。誰能回答一下)
讓我們簡單回顧一下PS1,PS2,PS3的作用: PS1是用來控制shell提示符的樣式。例如我登陸shell的式樣是:root@ywjPC:~# PS2是當我們輸入"\"時,多行提示符的樣式,預設是">". PS3是Shell指令碼中使用select時的提示符。2.偽訊號偽訊號和工作方式和trap一樣,但它們時由shell本身產生,可以像對待shell指令碼裡的實際訊號一樣對待它。偽訊號 發送時間 EXIT shell從指令碼中退出後 DEBUG shell已經執行了一個語句2.1.EXIT例如下面的指令碼a.sh: trap "echo 'exit from shell'" EXIT
echo "hello"
執行結果: # ./a.sh
hello
exit from shell2.2.DEBUGDEBUG用來在一個函數或指令碼內所有語句後執行陷阱代碼。它的主要用途是用來作為一種跟蹤錯誤的程式狀態元素的強制性方法。例如下面的指令碼a.sh: function dbgtrap
{
echo "i=$i"
}
i=1
trap dbgtrap DEBUG
i=$((i+1))
i=$((i+1))
i=$((i+1))
trap - DEBUG
指令碼中兩個trap之間的每條語句執行後都會執行dbgtrap函數,包含第一個trap語句。執行結果: # ./a.sh
i=1
i=2
i=3
i=4
其中i=1是trap dbgtrap DEBUG語句執行後輸出的。