- PR -

シェルスクリプトでの異常処理について

1
投稿者投稿内容
フレ
会議室デビュー日: 2003/03/23
投稿数: 12
投稿日時: 2003-03-24 16:50
お世話になります。ヤマと申します。

シェルスクリプト内で実行しているコマンドが
正常に終了したかどうかを確認したいのですが
コマンド毎に $?が0であるかどうかの判定処理を
記述するのは抵抗があったため、とりあえず
以下のようなスクリプトを作成しました。

それなりに正常に動作すると思っていたのですが
以下のtest関数のように
内部でreadを使っているスクリプトや関数を
execCommand関数内で実行すると
正常に動作しません。

ヒアドキュメントでexecCommandを呼び出して、
その内部でreadが実行されているためだとは
思いますが解決策がわかりません。

どなたかこのような場合の解決策を
ご存知の方はいらっしゃいませんでしょうか?

また、一般的にシェルスクリプトで例外処理っぽいことを
したい場合は、みなさんどのようにされてますか?

教えていただけるとうれしいです。

以上です。
よろしくお願いします。
※長文ですみません。


【環境】
OS :RedhatLinux7.1
シェル:bash

【シェルスクリプト】
============================================================
#!/bin/sh

test()
{
while :; do
echo "y を入力してください"
read IN
case $IN in
y) break;;
*) sleep 0;
esac
done
}

execCommand()
{
while read line ; do
eval "$line" 2>/tmp/err.txt
EXITCODE=$?
if [ 0 != $EXITCODE ]; then
echo "$line" >/tmp/cmd.txt 2>/dev/null
echo "$EXITCODE" >/tmp/exitcd.txt 2>/dev/null
return $EXITCODE
fi
done
}


execCommand << _SCRIPT
rm -f /tmp/ngfile
mkdir /tmp/aaa/ngfile 2>/dev/null; :;
TESTVAL=12345
echo "TESTVAL[ \$TESTVAL ]"
rm /tmp/zzz/ngfile
_SCRIPT

if [ 0 != $? ]; then
echo "--- エラーコマンド ---"
cat /tmp/cmd.txt
echo "--- リターンコード ---"
cat /tmp/exitcd.txt
echo "--- エラーメッセージ ---"
cat /tmp/err.txt
# exit `cat /tmp/exitcd.txt`
fi


execCommand << _SCRIPT
echo "start"
test
_SCRIPT

if [ 0 != $? ]; then
echo "--- エラーコマンド ---"
cat /tmp/cmd.txt
echo "--- リターンコード ---"
cat /tmp/exitcd.txt
echo "--- エラーメッセージ ---"
cat /tmp/err.txt
# exit `cat /tmp/exitcd.txt`
fi
============================================================
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2003-03-24 18:06
testってコマンドが既に存在しているのですが、そのコマンドが呼ばれてるだけって事はないですか?
dario
会議室デビュー日: 2003/03/11
投稿数: 11
投稿日時: 2003-03-24 19:26
ヒアドキュメントで渡しているということは
それが標準入力になるということですよね。
ということはreadを使ってもヒアドキュメントの内容を読むだけです。
こんな感じのスクリプトで試して見るとわかります。
最小限まで切り詰めていないのが申し訳ないですが…

#!/bin/sh
hoge()
{
read IN
echo $IN
}

execCommand()
{
while read line ; do
eval "$line"
done
}

execCommand << _DATA
echo "start"
hoge
echo "end"
_DATA

>また、一般的にシェルスクリプトで例外処理っぽいことを
>したい場合は、みなさんどのようにされてますか?

エラーメッセージなどは取れませんが、
コマンドを&&でつなぐのは解決になりませんか?

#やっぱりtest()はダメだよなあと思いつつ
フレ
会議室デビュー日: 2003/03/23
投稿数: 12
投稿日時: 2003-03-25 12:06
やまです。
t-wataさん、darioさん返答ありがとうございます。

> testってコマンドが既に存在しているのですが...
>
> #やっぱりtest()はダメだよなあと思いつつ
>
おおぉっ!大失敗 ^^;
提示するサンプルを書いている時点で
ぼ〜っとしてて test コマンドのことをすっかり忘れてました。
※普段あまり test コマンド使わないので... ^^;

> エラーメッセージなどは取れませんが、
> コマンドを&&でつなぐのは解決になりませんか?
>
コマンドを && でつなぐ場合は、やはり
コマンド毎に記述する必要がありますよね?
そうであればちょっと抵抗があります。

邪道な手かもしれませんが以下のような
方法を思いつきました。
ファイルディスクリプタを切り替えることで
対処する方法です。

とりあえずこれで動かしてみて問題なさそうであれば
この方法にしたいと思います。


【修正版スクリプト】
==================================================
#!/bin/sh

hoge()
{
while :; do
echo "y を入力してください"
read IN
case $IN in
y) break;;
*) sleep 1;
esac
done
}


execCommand()
{
FILENUM=1
while read line ; do
echo "$line" >> /tmp/cmd_$FILENUM
FILENUM=`expr $FILENUM + 1`
done

exec 0<&3 3<&-

ROOPNUM=1
while [ $ROOPNUM -le $FILENUM ] ; do
FILENAME=/tmp/cmd_${ROOPNUM}
if [ -f $FILENAME ]; then
. $FILENAME 2>/tmp/err.txt
EXITCODE=$?
if [ 0 != $EXITCODE ]; then
mv $FILENAME /tmp/cmd.txt
echo "$EXITCODE" >/tmp/exitcd.txt
rm -f /tmp/cmd_*
return $EXITCODE
fi
fi
ROOPNUM=`expr $ROOPNUM + 1`
done
rm -f /tmp/cmd_*
}


execCommand 3<&0 0<<_SCRIPT
rm -f /tmp/ngfile
mkdir /tmp/aaa/ngfile 2>/dev/null; :;
TESTVAL=12345
echo "TESTVAL[ \$TESTVAL ]"
rm /tmp/zzz/ngfile
_SCRIPT
if [ 0 != $? ]; then
echo "--- エラーコマンド ---"
cat /tmp/cmd.txt
echo "--- リターンコード ---"
cat /tmp/exitcd.txt
echo "--- エラーメッセージ ---"
cat /tmp/err.txt
fi

echo
execCommand 3<&0 0<<_SCRIPT
echo "start"
hoge
echo "end"
_SCRIPT
if [ 0 != $? ]; then
echo "--- エラーコマンド ---"
cat /tmp/cmd.txt
echo "--- リターンコード ---"
cat /tmp/exitcd.txt
echo "--- エラーメッセージ ---"
cat /tmp/err.txt
fi
==================================================

1

スキルアップ/キャリアアップ(JOB@IT)