bash スクリプトの local 文ではまった [bash]

コマンドを実行し、出力を変数に代入する。
その結果 (戻り値) を使用するコードではまりました。

例えば下のような使い方。

retval=`command | grep keyword`
if [ $? -ne 0 ]; then
   return 1

このコードは想定通りの動作をします。

しかし、代入と local 宣言が 1 文で行われる場合、結果変わります。
例えば、下のスクリプトを実行すると結果はどうなるか。

#!/bin/bash

function f()
{
local foo=`hoge`
echo $?

bar=`hoge`
echo $?
}

f


結果はこうなります。

# ./local.sh
./local.sh: line 5: hoge: command not found
0
./local.sh: line 8: hoge: command not found
127

local はコマンドなので、1 つ目のコマンドは 0 (成功) を返すのです。

local コマンドと結果を見たいコマンドを分けると期待した動作になります。

local foo
foo=`hoge`
echo $?