ksh のバリアントって何がどれ問題 (pdksh vs oksh vs mksh)

主に自分のためのメモ。 ksh の多数あるバリアント(フォークやクローンを含む)の区別について。

「夢のシェルスクリプト言語 KornShell (ksh93) 〜すごいぞ!型とクラスは本当にあったんだ!〜」 から引用する と、以下のようになるらしい

  • AT&T 公式
    • ksh86 - 一番最初に公開された ksh。試験的なツールという扱いでサポートなしだが誰でも安価にソースコードを入手できた
    • ksh88 - POSIX シェルの元になった。プロプライエタリでソースコード非公開
    • ksh93 - ksh93q (2005) からオープンソース。最終バージョンは ksh93u+ (2012)。その後 93v-(不安定ベータ版)まで開発が続く
  • AT&T 非公式
    • ksh2020 - 93v- を元に開発が行われたが互換性問題が多く取り消された
    • ksh93u+m - ksh93u+ を元にバグ修正をメインとして再始動。現在開発が継続中
  • クローン(ソースコードを共有していない)
    • 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 で生活しようとするのならば(そんな日が来るか知らないが)、これがいちばん良さそうに思う。