はじめに
Bashism などと言われ、あたかも bash でしか使えない機能のように言われている機能の多くは、実は ksh(ksh88 や ksh93)で最初に実装された機能です。Bashism の多くは bash でしか使えない機能ではありません。現実のシェルスクリプトは POSIX で標準化された機能だけをシェルが実装していれば動くわけではありません。ksh で実装された機能を使うシェルスクリプトを動かすには、bash にもその機能を実装しなければいけません。bash はむやみに独自の拡張機能を追加しまくったわけではなく、単に ksh の代替となるシェルを作っていただけなんです。つまり Kshism です。もちろん独自機能もありますが、zsh からの導入、つまり Zshism もあります。
zsh は bash の上位互換シェルではない
一部に勘違いが見られますが zsh は bash の上位互換シェルではありません。bash、ksh、zsh、これらのシェル(その他のシェルも)はお互いのシェルの機能を参考にしながらも、独自のシェルを作っています。自分たちの考え方に合わなければ、お互いのシェルの機能を導入しません。
ですが一部の機能は複数のシェルで同じように実装されており、すべてが bash でしか使えない機能というわけでもありません。特に bash は ksh とは互換性が高く、たとえ bash が使えなくなっても、代わりに ksh で動かすなんてこともできちゃうわけです。
bash の独自機能ではないものを Bashism と呼んで移植性がない機能だと言うのは、いい加減やめませんか? ksh や zsh でも動くのであれば移植性あるでしょう?
Bashのバージョン履歴と追加機能
Is there a list of which features were added to specific releases (versions) of Bash?
詳細は↑を参照してください
もともとこの記事は Bash の初期のバージョンがいつリリースされたか、そのときに導入された機能がどのシェルから来たのかをまとめた記事にしようと思ったのですが、探したらまとまった情報があったので単にそれを紹介するだけの記事に成り下がりました。つまり自分用メモです。
上記の記事より。以下のページにはもっと詳細な情報があります。
Greg's Wiki BashFAQ/061の補足
読んでいて少し勘違いされそうな点について補足です。
bash 2.0 (1996) で導入された配列の機能は「csh (1979), zsh (1991) for array=(assignment) syntax」と記事には書かれていますが、ksh88 にも異なる文法 (set -A
を使う)で導入されており、zsh からは array=(assignment)
という文法が採用されたという意味です。配列そのものは csh にもあるのはそのとおりですが、bash が導入した理由としては ksh88 にもあったからだと考えられるでしょう。
POSIX シェルの標準規格の話
POSIX ではシェルの標準規格が作られていますが、POSIX 自身が新しい機能を考えて、それを実際のシェルが追加しているわけではありません。POSIX シェルの標準規格は、bash、ksh、zsh などのシェルで広く使える機能から選ばれて採用されます。したがって一部の人が忌み嫌う(?)Bashism は将来の POSIX 標準規格の候補なのです。