bash の関数呼び出しの罠

bash で定義した関数を呼び出すときには、() を付けない。プログラムを呼び出すときだって () を付けないのだから、当たり前といえば当たり前なのだが、もし () をつけてしまうとひどいことになる。

doit() {
 echo "I am doit()"
}

doit()
echo 1
echo 2
doit

の実行結果は、

I am doit()
1
2
I am doit()

ではなく、なんと

2
1

である。

種明かしをすると、二回目の doit() は、関数の再定義とみなされ、{} が続かないので次の echo 1 が doit の内容として再設定されてしまうのである。

文法エラーにもならないし、恐ろしい罠だ。有名なのかもしれないけれど、数時間これにはまっていた……