シェルのデバッグ(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

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




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

対象:csh、tcsh

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

シェルにはデバッガーがあるわけではないので、デバッグにはちょっとコツがいります。-x オプションを指定して、実行ラインを標準エラーに出しながら行うことも可能ですが、本来のスクリプトの出力とごっちゃになってわけがわからなくなる場合もあります。簡単なスクリプトなら、それでも大丈夫でしょうが。

私の場合、デバッグプリントと言う古典的な手法を用いますが、echo や printf でただ単に出力させると、デバッグ完了後の本番時には、その echo 文などを削除するかコメントアウトする必要があり、それもまた手間がかかります。

そこで、echo や printf の代わりにデバッグ専用の Decho、Dprintf を別名定義や関数化してスクリプトに埋め込み使っています。まずは、サンプルコードを見てください。

“シェルのデバッグ(csh、tcsh系)” の続きを読む