bashの練習がてら、以下のようなツールを作ってみたが便利に使えるので、報告する。。
コマンド lrun)
lrunという名前は、log + run という意味で付けた。
意味: logファイルを残しつつ、画面にも表示してコマンドを実行する。
意味: logファイルを残しつつ、画面にも表示してコマンドを実行する。
基本はログファイルは、日付.log の名前になる。例えば2012/8/1に実行すれば、
カレントディレクトリの 20120801.log というファイルに書き出される。
コマンド引数)
lrun オプション コマンド列
オプションには以下が使える。
-d : 意味はdry run: 表示だけして、コマンド列を実行しない
-o: 意味はoverwrite: 通常はログファイルにアペンドだが、ログを消去してoverwriteする
-p 文字列 : 意味はprefix : ファイル名の日付の前に "文字列-"というプリフィックスを付ける
-s 文字列 : 意味はsuffix: ファイル名の日付とlogの間に "-文字列" という、サフィックスを付ける。
-P : 直前に使ったprefix を再利用して、ファイル名にprefixをつける。
-S : 直前に使ったsuffix を再利用して、ファイル名にsuffixをつける。
ソースコード) - たったこれだけ -
#/bin/bash -f
fbody=`date +%Y%m%d`;
ldir=~/.scripts
pre=.lrun.prefix
suf=.lrun.suffix
while getopts dos:p:SP OPT
do
case $OPT in
"d") # Dryrun
dry=1;;
"o") # overwrite log
ovw=1;;
"p") #prefix
echo $OPTARG > $pre
fbody=$OPTARG-$fbody;;
"s") # suffix
echo $OPTARG > $suf
fbody=$fbody-$OPTARG;;
"P") # reuse prefix
fbody=`cat $pre`-$fbody;;
"S") # reuse suffix
fbody=$fbody-`cat $suf`;;
esac
done
fname="$fbody.log"
# shift options.
shift `expr $OPTIND - 1`
if [ $ovw ]; then
red='>'
msg="log is over-written to $fname ...."
else
red='>>'
msg="log is written to $fname ...."
fi
echo $msg
cmd="date +\"%n----Log: %c ----%n$*%n\" $red $fname; $* 2>&1 | tee -a $fname"
if [ $dry ]; then
echo Dry run: $cmd
else
eval $cmd
fi