シェルスクリプトのデバッグツール、bashdbPrograming Bible(2/3 ページ)

» 2008年12月04日 13時30分 公開
[Ben Martin,SourceForge.JP Magazine]
SourceForge.JP Magazine

 以下、bashdbの使い方を説明するが、その際、例として次に示すbashスクリプトを用いることにする。これは1つの数値nを引数として受け取り、n番目のフィボナッチ数を計算するスクリプトだ。


#!/bin/bash
version="0.01";
fibonacci() {
    n=${1:?If you want the nth fibonacci number, you must supply n as the first parameter.}
    if [ $n -le 1 ]; then
    echo $n
    else
    l=`fibonacci $((n-1))`
    r=`fibonacci $((n-2))`
    echo $((l + r))
    fi
}
for i in `seq 1 10`
do
  result=$(fibonacci $i)
  echo "i=$i result=$result"
done

 それでは、このスクリプトの動作をbashdbで調べてみよう。下に示したのは、スクリプトを1行ずつ実行していき、fibonacci関数の中に入って変数を調べている様子だ。見やすさのため、入力したテキストは太字にしてある。最初にバックトレース(bt)を実行しているが、その結果からスクリプトが3行目から始まっていることが分かる。この行では、version変数に値を設定している。

 次に、nextコマンドで次の行に進み、listコマンドで現在実行している行を表示している。次のnextコマンドに続いて、何も入力せずにEnterを押しているが、この場合これはnextコマンドを実行することになる。次に、examineコマンドの1文字ショートカットであるxを実行している。その結果から、このコマンドがdeclareを利用して変数を表示していることが分かる。このすぐ後で、同じ変数をprintコマンドを使って表示しているが、こちらはdeclareを使わない。次に、fibonacci関数にブレークポイントを設定し、continueでシェルスクリプトの実行を再開させている。そして、fibonacci関数が呼び出されるとスクリプトの実行が止まる。そこで、nextで1行ずつ実行していき、変数を調べて終わっている。


$ bash --debugger ./fibonacci.sh
...
(/home/ben/testing/bashdb/fibonacci.sh:3):
3:    version="0.01";
bashdb<0> bt
->0 in file `./fibonacci.sh' at line 3
##1 main() called from file `./fibonacci.sh' at line 0
bashdb<1> next
(/home/ben/testing/bashdb/fibonacci.sh:16):
16:    for i in `seq 1 10`
bashdb<2> list
 16:==>for i in `seq 1 10`
 17:   do
 18:   result=$(fibonacci $i)
 19:   echo "i=$i result=$result"
 20:   done
bashdb<3> next
(/home/ben/testing/bashdb/fibonacci.sh:18):
18:    result=$(fibonacci $i)
bashdb<4>
(/home/ben/testing/bashdb/fibonacci.sh:19):
19:    echo "i=$i result=$result"
bashdb<5> x i result
declare -- i="1"
declare -- result=""
bashdb<7> print $i $result
1
bashdb<10> break fibonacci
Breakpoint 1 set in file /home/ben/testing/bashdb/fibonacci.sh, line 5.
bashdb<11> continue
Breakpoint 1 hit (1 times).
(/home/ben/testing/bashdb/fibonacci.sh:5):
5:    fibonacci() {
bashdb<(12)> next
(/home/ben/testing/bashdb/fibonacci.sh:6):
6:    n=${1:?If you want the nth fibonacci number, you must supply n as the first parameter.}
bashdb<(13)> next
(/home/ben/testing/bashdb/fibonacci.sh:7):
7:    if [ $n -le 1 ]; then
bashdb<(14)> x n
declare -- n="2"
bashdb<(15)> quit

 ここで、終わり近くのbashdbプロンプトの数字が丸括弧でくくられている点に注意。これは、サブシェルに入ったことを示している。この場合は、シェル関数の中に入ったことを意味する。

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ