
Ubuntu日本語フォーラム

ログインしていません。
呼び出す関数が見つからないとき、関数の返り値を local コマンドと同時に使用すると、続きを実行してしまいます。(下記var1への代入)
local コマンドと同時でなければ、正しく実行を中断します。(下記var2への代入)
var1 の場合でも中断してほしいのですが、これは bash のバグですか?
Ubuntu 9.10
GNU bash, version 4.0.33(1)-release (i486-pc-linux-gnu)
temp.sh
====================================
#!/bin/bash -eE
function Main_func()
{
local var1=$( NotDefined_func "a" )
echo "<ERROR msg=\"Do not come here 1\"/>"
local var2
var2=$( NotDefined_func "a" )
echo "<ERROR msg=\"Do not come here 2\"/>"
}
Main_func
====================================
実行結果
====================================
$ ./temp.sh
./temp.sh: line 5: NotDefined_func: コマンドが見つかりません
<ERROR msg="Do not come here 1"/>
./temp.sh: line 8: NotDefined_func: コマンドが見つかりません
====================================
オフライン
-eオプションを付けることによってvar1への代入でチェックしているのは、localコマンドの終了ステータスだからではないでしょうか。
man bashのlocalコマンドの説明では、以下のとおり書かれています。
「不正なnameが与えられたり、nameが読み取り専用であったりしなければ、localの返却ステータスは0となります。」
オフライン
bashについて
ことわり:これから書きます内容には間違いがあるかもしれません。
そのつもりで読んでください。
bashのコマンド出力には、下記2種類のエラーメッセージがあります。
・標準出力 画面、及びファイル :終了ステータス(1)・・アプリ内部から出力されるエラーメッセージなど
・標準エラー出力 画面 :終了ステータス(2)・・コマンド構文エラーなど解決できないエラーメッセージ
コマンドが正常終了した場合は終了ステータス(0)が出力されます。
但し、この終了ステータスは評価しない限りシェル実行の中断とはなりません。
下記サンプルを参考にしてください。
あるフォルダにa.txt、b.txt、d.txtがあり、この各ファイルの内容を表示するスクリプトを実行した結果です。
echo AAA > a.txt
echo BBB > b.txt
echo DDD > d.txt
echo "#!/bin/sh" > test1.sh
echo "for DIR in a b c d; do" >> test1.sh
echo "cat $DIR.txt >> test1.txt
echo "done" >> test1.txt
chmod +x test1.sh
./test1.sh
結果-----------------------------------------------------------
AAA
BBB
cat: c.txt: No such file or directory
DDD
結果-----------------------------------------------------------
echo "#!/bin/sh" > test2.sh
echo "for DIR in a b c d; do" >> test2.sh
echo "cat $DIR.txt || exit 1 >> test2.txt
echo "done" >> test2.txt
chmod +x test2.sh
./test2.sh
結果-----------------------------------------------------------
AAA
BBB
cat: c.txt: No such file or directory
結果-----------------------------------------------------------
test2.shのcat コマンドの後に終了ステータスを評価することにより
正常終了(0)以外なら明示的にシェルの実行を終了させています。
オフライン
emasaka様の方が当を得てますね。
私の書き込みは無視してください。
失礼しました。
オフライン
回答ありがとうございます。
local の終了ステータスが 0 であるのが直接の原因ですね。
しかし、local が付かない代入は正しく実行を中断しますし、そもそも問題の解決にはなっていません。
この違いが local の仕様というのであれば、仕様どおりに動いていますが、それは、local の仕様のバグですね。
今のところ対策は無さそうなので、これからは、local と同時に代入しないように、気をつけて使うことにします。
オフライン
こんにちは。
localが付かない代入は、コマンドではないため、終了ステータスを持ちません。
そのため、該当する行が終了した時点では、$() の終了ステータスである127が終了ステータスとしてみなされ、
-eの指定されたシェルがエラーとして扱います。
ご参考まで。
オフライン