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 の内容として再設定されてしまうのである。
文法エラーにもならないし、恐ろしい罠だ。有名なのかもしれないけれど、数時間これにはまっていた……