以下、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.