対象:csh、tcsh
シェル(csh、tcsh系)のデバッグは alias を利用する
シェルにはデバッガーがあるわけではないので、デバッグにはちょっとコツがいります。-x オプションを指定して、実行ラインを標準エラーに出しながら行うことも可能ですが、本来のスクリプトの出力とごっちゃになってわけがわからなくなる場合もあります。簡単なスクリプトなら、それでも大丈夫でしょうが。
私の場合、デバッグプリントと言う古典的な手法を用いますが、echo や printf でただ単に出力させると、デバッグ完了後の本番時には、その echo 文などを削除するかコメントアウトする必要があり、それもまた手間がかかります。
そこで、echo や printf の代わりにデバッグ専用の Decho、Dprintf を別名定義や関数化してスクリプトに埋め込み使っています。まずは、サンプルコードを見てください。
csh、tcshの場合のサンプルコード debug.csh
#!/bin/csh # ログファイル名 # debug.log は適当なパスを記述する setenv DLOG debug.log # デフォルトでは、デバッグログを出力しない設定 alias Decho ':' alias Dprintf ':' alias DechoOFF "alias Decho ':'" alias DprintfOFF "alias Dprintf ':'" alias DebugOFF "DechoOFF;DprintfOFF" # デバッグ出力をログファイル($LOG)に出力するなら2行目を有効にする alias DechoON "alias Decho 'echo \!* '" #alias DechoON "alias Decho 'echo \!* >> $DLOG'" alias DprintfON "alias Dprintf 'printf \!* '" #alias DprintfON "alias Dprintf 'printf \!* >> $DLOG'" alias DebugON "DechoON;DprintfON" ##### 以下は動作確認 # 出力されない Decho 1 2 3 Dprintf "%s %s %s\n" a b c # 出力される # Decho、Dprintf を個別にONにする DechoON Decho 2 2 3 DprintfON Dprintf "%s %s %s\n" b b c # 出力されない # Decho、Dprintf を個別にOFFにする DechoOFF Decho 3 2 3 DprintfOFF Dprintf "%s %s %s\n" c b c # 出力される # Decho、Dprintf を一括でONにする DebugON Decho 4 2 3 Dprintf "%s %s %s\n" d b c # 出力されない # Decho、Dprintf を一括でOFFにする DebugOFF Decho 5 2 3 Dprintf "%s %s %s\n" e b c
実行結果
% debug.csh 2 2 3 b b c 4 2 3 d b c
概要
-x オプションは、1行目に #!/bin/tcsh -x と書けばいいわけですが、それをやらずにデバッグプリントを出力し、さらにその出力をする/しないを簡単に切り替えることが可能です。
echo や printf の代わりにデバッグ用に Decho、Dprintf と言うコマンドを用意しています。コマンドと言っても aliasで別名定義をうまいことやっているのです。
デバッグ用には、echo や printf を使わずに必ず Decho、Dprintfを使います。構文に違いはありません。これらは、DebugON を実行した後は出力され、DebugOFF を実行した後は出力されません。
詳細
6行目:デバッグプリントを標準出力ではなく、ファイルに出力する場合のファイル名を指定します。サンプルでは、”debagu.log” と言うファイル名ししています。ファイルに出すか、標準出力に出すかの切り替えは、16行目と17行目のコメントアウトを入れ替えることによって行います。同様に18行目と19行目も同じ関係にあります。
9~10行目:Decho、Dprintf を記述した場合、aliasによって”:”に置き換えられます。”:”は、何もしないコマンドです。よって、この設定がされていると、
Decho xyz
とスクリプト中に書いても何も起こりませんと言うか処理されません。
11~12行目:Decho、Dprintf を出力しないようにするコマンド DechoOFF、DprintfOFF を定義しています。
13行目:DechoOFF、DprintfOFF を一括で行うコマンド DebugOFFを定義しています。
16、18行目:Decho、Dprintf を出力するようにするコマンド DechoON、DprintfON を定義しています。
17、19行目:Decho、Dprintf をファイルに出力するようにするコマンド DechoON、DprintfON を定義しています。サンプルではコメントアウトしているので、標準出力に出力されます。ファイルに出力したい場合は、このコメントを外して、16、18行目をコメントアウトしてください。
20行目:DechoON、DprintfON を一括で行うコマンド DebugON を定義しています。
ここまでが重要な部分です。ここまでの部分をスクリプトの先頭に埋め込むか、.cshrc や .tcshrc に入れるなどして使ってください。
27行目以降は、実際の動作を確認しています。ここからは、コードにあるコメントのとおりです。初期状態では、出力されないので30~31行目は何も起こりません。
あとは、ON/OFF の切り替えを Decho と Dprintf で個別に行うか、一括で行っているかの違いのみです。
どうでしょうか。これで、デバッグも少しは楽になるのではないでしょうか。
次回は、同じように sh、bash 系のデバッグについて書きます。