- - PR -
シェルスクリプトでの異常処理について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ============================================================ |
|
投稿日時: 2003-03-24 18:06
testってコマンドが既に存在しているのですが、そのコマンドが呼ばれてるだけって事はないですか?
|
|
投稿日時: 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-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