お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2011-08-13 13:10:12

Ts_Neko
新しいメンバ
登録日: 2011-08-13

bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

呼び出す関数が見つからないとき、関数の返り値を 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: コマンドが見つかりません
====================================

オフライン

 

#2 2011-08-13 16:54:58

emasaka
メンバ
登録日: 2008-02-14

Re: bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

-eオプションを付けることによってvar1への代入でチェックしているのは、localコマンドの終了ステータスだからではないでしょうか。

man bashのlocalコマンドの説明では、以下のとおり書かれています。
「不正なnameが与えられたり、nameが読み取り専用であったりしなければ、localの返却ステータスは0となります。」

オフライン

 

#3 2011-08-13 17:18:24

のんき
メンバ
登録日: 2007-03-04

Re: bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

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)以外なら明示的にシェルの実行を終了させています。

オフライン

 

#4 2011-08-13 17:24:06

のんき
メンバ
登録日: 2007-03-04

Re: bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

emasaka様の方が当を得てますね。
私の書き込みは無視してください。
失礼しました。

オフライン

 

#5 2011-08-14 15:27:52

Ts_Neko
新しいメンバ
登録日: 2011-08-13

Re: bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

回答ありがとうございます。

local の終了ステータスが 0 であるのが直接の原因ですね。
しかし、local が付かない代入は正しく実行を中断しますし、そもそも問題の解決にはなっていません。
この違いが local の仕様というのであれば、仕様どおりに動いていますが、それは、local の仕様のバグですね。

今のところ対策は無さそうなので、これからは、local と同時に代入しないように、気をつけて使うことにします。

オフライン

 

#6 2011-08-16 18:07:20

emasaka
メンバ
登録日: 2008-02-14

Re: bash で、呼び出す関数名が見つからなくても中断しない。 バグ?

こんにちは。

localが付かない代入は、コマンドではないため、終了ステータスを持ちません。
そのため、該当する行が終了した時点では、$() の終了ステータスである127が終了ステータスとしてみなされ、
-eの指定されたシェルがエラーとして扱います。

ご参考まで。

オフライン

 

Board footer

Powered by FluxBB