ksh のバリアントって何がどれ問題 (pdksh vs oksh vs mksh)
主に自分のためのメモ。 ksh の多数あるバリアント(フォークやクローンを含む)の区別について。
「夢のシェルスクリプト言語 KornShell (ksh93) 〜すごいぞ!型とクラスは本当にあったんだ!〜」 から引用する と、以下のようになるらしい
- AT&T 公式
- AT&T 非公式
- クローン(ソースコードを共有していない)
- pdksh - ksh88 のパブリックドメイン実装版。1999 年に開発が終了
- OpenBSD ksh - 2003 年頃に pdksh をフォークしてコードのクリーンアップ、バグ修正を行う
- mksh - pdksh のフォーク。OpenBSD ksh の成果を引き継ぎ 2004 年以降は独自に機能強化。現在も開発は続いている
これで pdksh / oksh (OpenBSD ksh) / mksh の差を理解することができる。
以下は上の引用元記事から受ける印象と、実際にインストールしたときの感想になる(あまり信頼できるものじゃない)。
上記を読む限り、 pdksh は最も歴史が古く、ksh88 のほぼ純粋なクローンであるようだ。ちなみに私が FreeBSD でインストールしたとき、他のシェルから ksh を呼んだときに ~/.kshrc の類いを読まないことに驚いた記憶がある。そのような動作をさせる場合には ENV
環境変数で明示的にrcファイルを指定するか、ビルド時に DEFAULT_ENV
パラメータを設定しておく必要があるらしい。またデフォルトのシェル編集は emacs モードでも vi モードでもない (set -o emacs or vi で指定するまでは単にshと同等)。
oksh は pkdsh のフォークのようだが、こちらはデフォルトで ~/.kshrc を読む。また最初から emacs モードのシェル編集が有効になっている。全体としてはあくまで ksh88 の再現を目的としたクリーンなコードベースということか?
mksh は ksh93 の特徴も取り込んで積極的に機能を拡張する方向にあるようだ。こちらはデフォルトで ~/.mkshrc を読む。開発もアクティブなので、もし ksh で生活しようとするのならば(そんな日が来るか知らないが)、これがいちばん良さそうに思う。