Bash Debugger Project(bashdb)を使うと、bashスクリプトにブレークポイントを設定したり変数を調べたりバックトレースしたり1行ずつ実行したりすることができる。bashdbは、C/C++デバッガー並みの技法でbashスクリプトをデバッグするツールだ。
インストールされているbashがbashdbをサポートしているかどうかは、次のコマンドを実行してみればわかる。下に示したbashdbのプロンプトが表示されなければ、bashdbをインストールする必要がある。
$ bash --debugger -c "set|grep -i dbg" ... bashdb<0>
bashdbのパッケージはUbuntu Intrepidのリポジトリーにはあるが、openSUSE 11やFedora 9のリポジトリーにはない。試用マシンは64-bit Fedora 9マシンなので、通常のコマンド「./configure; make; sudo make install」を使ってソースからbashdbバージョン4.0-0.1をビルドした。
Bash Debuggerを起動するときは「bash --debugger foo.sh」という構文を利用するか、「bashdb foo.sh」コマンドを実行する。I/Oリダイレクションで問題が発生する可能性がある場合を除き最初の起動方法が推奨されているので、以下の説明ではこの方法を用いることにする。このほか、dddやEmacsバッファーから起動することもできる。
bashdbのコマンドは、GNU debugger(gdb)とよく似ている。たとえば、スクリプトの次の行を実行するコマンドはstepまたはnextで、前者は関数の内部にまで入るが後者は入らない。バックトレースはbt、bashdbを抜けるときはquitまたはCtrl-D、変数を表示するなら「print $foo」という具合だ。しかし、gdbとは少し異なるところもあり、最後の例で変数に接頭辞$を付けるのもその一つ。また、bashdbのプロンプトで何も入力せずにEnterを押すと、直前のコマンドに関わらず、最後に実行したstepコマンドまたはnextコマンドのいずれかが実行されるところも異なる。
シェル変数を確認したいときは、上に述べたようにprintコマンドを使うが、その際、変数名には接頭辞を付けなければならない($foo)。もう少し短い「 x foo」コマンドを使う方法もある。このコマンドはdeclareコマンドを使って表示するので、関数の定義を確認したいときにも使える。
bashdbとデバッグ対象のスクリプトは同じbashシェルの中で動作する。そして、bashは名前空間という概念が希薄なため、bashdbの関数とシンボルはグローバルな名前空間の中に置かれることになり、したがってスクリプトからも見えることになる。そこで、bashdbはシンボルに_Dbg_という接頭辞を付けて区別する。このため、スクリプトでこの接頭辞を使ってはならない。さもないと、クラッシュする可能性がある。bashdbは環境変数も使うが、同様に、DBG_という接頭辞が付く。ほかに、BASH_という接頭辞を持つ標準のbash環境変数も使う。
