SyntaxHighlighter

2014年2月14日金曜日

bashのlocal 気をつけること

bashで関数書くとき、変数スコープを小さくしたいから local って書きますよね。書きますよね?

この local ですが、、、 ビルトインコマンドだったとは…(´д`) これを知らずに6時間ぐらい無駄にしたよー(´д`)

こんな感じ。ファイル名は適当にaa.sh。
 
#!/bin/sh

function hoge() {
  rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end
で、実行
  
$ ./aa.sh
start
mkdir: cannot create directory `/dev/null': File exists
[1]
end
$
これは想定どおり。$?に1が入りますね。

ここで、変数 rt を local 宣言(実はコマンド)します。

#!/bin/sh

function hoge() {
  local rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

で、実行。

0]
end
$
えええええー。 $? が 0、つまり正常終了じゃないですかああああ┐(´д`)┌

無知とは怖いものです。localコマンドの実行で$?が0になってるんですなあ・・・たぶん。


この混乱で、∀ガンダム10話観れるぶんの時間無駄にしたわ。死ぬわー

次のようにすれば目的は達せる、と。
 
local rt
 rt=`mkdir /dev/null`
  echo [$?]
}

echo start

hoge

echo end

その他、bashのlocalは、「localを実行した変数は、その関数内だけでなく、その関数が呼び出す関数でも有効」という妙なスコープになっているとのこと。

気をつけましょう(´ー`)

0 件のコメント:

コメントを投稿