evalで実行されるコマンドの戻り値をとる

コンフィグにコマンドのテンプレートを記述し、そのテンプレート実行結果を取得するためにevalする。

$ host=hogehoge
$ TMPL='/usr/bin/ping $host 1 1'
$ eval "$TMPL > /dev/null; echo $?"
0

hogehogeなんてhostは存在しないので、1 を期待したけど、
evalの中に $? を入れるとevalの直前のコマンドの結果になっちゃう。
(直前にコマンドを間違えておくとその戻り値になる)

$ eval "$TMPL > /dev/null; echo \$?"

が正解でした。