対象:sh、bash
シェル(sh、bash系)のデバッグは alias を利用する
前回紹介したcsh、tcsh系に続いて、sh、bash系です。
私は、csh や tcsh 系を得意としていますが、世の中sh系を得意とする方もいるので、考えてみました。考え方や内容はほぼ一緒です。微妙な違いと言えば、function を一部使っていたり、alias の有効化みたいなおまじないが違います。function を使わずに alias だけでうまく作れるかもしれませんが、思いつきませんでした。あと、せっかくデバッグなので、シェルの行番号を出すように Decho の第一引数に $LINENO を付けています。これを alias の中に入れてしまいたかったのですが、うまくいかずに現状諦めてます。$LINENO は、csh、tcsh には無いので前回のサンプルには組み込んでいません。
sh、bash の場合のサンプルコード debug.sh
#!/bin/sh # alias を有効化 shopt -s expand_aliases # ログファイル名 # debug.log は適当なパスを記述する export DLOG=debug.log # デフォルトでは、デバッグログを出力しない設定 alias Decho=':' alias Dprintf=':' alias DechoOFF="alias Decho=':'" alias DprintfOFF="alias Dprintf=':'" alias DebugOFF="DechoOFF;DprintfOFF" function DechoF() { echo $* >> $DLOG ;} function DprintfF() { F=$1;shift;printf "$F" $* >> $DLOG ;} # デバッグ出力をログファイル($LOG)に出力するなら2行目を有効にする alias DechoON="alias Decho='echo'" #alias DechoON="alias Decho='DechoF'" alias DprintfON="alias Dprintf='printf'" #alias DprintfON="alias Dprintf='DprintfF'" alias DebugON="DechoON;DprintfON" ##### 以下は動作確認 # 出力されない Decho $LINENO 1 2 3 Dprintf "%d %s %s %s\n" $LINENO a b c # 出力される # Decho、Dprintf を個別にONにする DechoON Decho $LINENO 2 2 3 DprintfON Dprintf "%d %s %s %s\n" $LINENO b b c # 出力されない # Decho、Dprintf を個別にOFFにする DechoOFF Decho $LINENO 3 2 3 DprintfOFF Dprintf "%d %s %s %s\n" $LINENO c b c # 出力される # Decho、Dprintf を一括でONにする DebugON Decho $LINENO 4 2 3 Dprintf "%d %s %s %s\n" $LINENO d b c # 出力されない # Decho、Dprintf を一括でOFFにする DebugOFF Decho $LINENO 5 2 3 Dprintf "%d %s %s %s\n" $LINENO e b c
実行結果
% debug.sh 36 2 2 3 38 b b c 50 4 2 3 51 d b c
いかがでしょうか、簡単に出力する/しないも切り替えが可能ですし、ソース行番号も表示されてりと、デバッグが楽になると思います。