シェルの関数内関数

シェルスクリプトは古き良きBourne Shellで書くものであり、Manual Page - sh(1)を参照するのが良い。SUSv4のShell Command Languageでは高機能すぎる。ふと気づいたが、古き良きBourne Shellであっても関数内関数が使える。

foo() {
    f() { echo foo; }
}

bar() {
    f() { echo bar; }
}

foo
f
bar
f

実行すると(Heirloom Bourne Shellbashkshでは)下記のように表示された。

foo
bar

何がうれしいのかと問われると、プロトタイプ継承みたいなことをするに際して、すこしうれしい場面があるように思う。