シェルのデバッグ(sh、bash系)

対象:sh、bash

シェル(sh、bash系)のデバッグは alias を利用する

前回紹介したcsh、tcsh系に続いて、sh、bash系です。

シェルのデバッグ(csh、tcsh系)

私は、csh や tcsh 系を得意としていますが、世の中sh系を得意とする方もいるので、考えてみました。考え方や内容はほぼ一緒です。微妙な違いと言えば、function を一部使っていたり、alias の有効化みたいなおまじないが違います。function を使わずに alias だけでうまく作れるかもしれませんが、思いつきませんでした。あと、せっかくデバッグなので、シェルの行番号を出すように Decho の第一引数に $LINENO を付けています。これを alias の中に入れてしまいたかったのですが、うまくいかずに現状諦めてます。$LINENO は、csh、tcsh には無いので前回のサンプルには組み込んでいません。

200×200 高速大容量レンタルサーバ10G
mixhost

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

いかがでしょうか、簡単に出力する/しないも切り替えが可能ですし、ソース行番号も表示されてりと、デバッグが楽になると思います。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です