ksh(Korn Shell)とは|商用UNIXで標準採用される高機能シェルの全貌

プログラミング・IT

Unixシェルの世界には、bash、zsh、dashなど様々な種類がありますが、その中でも特に商用Unix環境で広く採用されているのが「ksh(Korn Shell)」です。

kshは、1980年代初期にAT&Tベル研究所で開発され、BourneシェルとCシェルの優れた機能を統合した強力なシェルです。
現在でも、AIX、Solaris、HP-UXなどの商用Unixシステムで標準シェルとして使われています。

この記事では、kshの歴史、主な特徴、バージョンの違い、bashとの比較、そして実際の使い方を詳しく解説します。

スポンサーリンク

kshとは

ksh(Korn Shell、コーンシェル)は、Unixシェルの一種です。
1980年代初期にAT&Tベル研究所のデビッド・コーン(David Korn)によって開発され、1983年7月14日のUSENIX年次大会で発表されました。

基本情報

正式名称: KornShell
略称: ksh
開発者: David Korn(AT&Tベル研究所)
初版リリース: 1983年7月14日
ライセンス: Eclipse Public License(2005年以降)
現在の開発: ksh93u+m(コミュニティ版)

kshは、Bourne Shell(sh)との完全な上位互換性を持ちながら、Cシェル(csh)の便利な機能も取り入れた強力なシェルです。

kshの歴史

開発の経緯

1980年代初頭、AT&Tベル研究所内のユーザーからの要望を受けて、デビッド・コーンがkshの開発を開始しました。

当時、Unix環境では主に以下の2つのシェルが使われていました。

Bourne Shell(sh):

  • スクリプト作成に優れる
  • しかし対話的機能が貧弱

Cシェル(csh):

  • 対話的機能が充実(コマンド履歴、ジョブコントロールなど)
  • しかしスクリプト言語としては問題が多い

kshは、これら両方の長所を統合することを目指して開発されました。

初期の開発貢献者

開発初期には、以下の開発者が重要な貢献をしました。

Mike Veach(マイク・ヴィーチ):

  • Emacsスタイルのコマンドライン編集モードを実装

Pat Sullivan(パット・サリヴァン):

  • viスタイルのコマンドライン編集モードを実装

これらの編集機能により、kshは対話的な操作が大幅に改善されました。

ライセンスの変遷

1983年〜2000年:

  • AT&Tのプロプライエタリソフトウェア
  • 商用ライセンスでのみ入手可能

2000年:

  • AT&T独自のライセンスでオープンソース化

2005年(ksh93q以降):

  • Common Public Licenseで配布
  • 後にEclipse Public Licenseに変更

2012年以降:

  • ksh93u+が最後の安定版(AT&T公式)
  • コミュニティ主導のksh93u+mプロジェクトが継続

kshのバージョン

kshには、主に2つの主要バージョンがあります。

ksh88(KornShell 88)

1988年にリリースされた最初の主要バージョンです。

主な特徴:

  • BourneシェルとPOSIX準拠
  • コマンド履歴とエイリアス機能
  • ジョブコントロール
  • コマンドライン編集(vi/Emacsモード)
  • 配列のサポート

ksh88の機能がPOSIX.2標準(IEEE Std 1003.2-1992)の基礎となりました。

多くの商用Unixシステム(AIX 4など)では、今でもksh88がデフォルトの/bin/kshとして使われています。

ksh93(KornShell 93)

1993年にリリースされた大幅な機能強化版です。

主な新機能:

連想配列:

typeset -A assoc_array
assoc_array[key1]="value1"
assoc_array[key2]="value2"
echo ${assoc_array[key1]}

浮動小数点演算:

typeset -F2 result
result=10.5+3.7
echo $result  # 14.20

複合変数:
データ構造を表現できる複合変数機能。

名前参照:
変数を名前で参照渡しできる機能。

拡張正規表現:
完全な正規表現マッチング機能。

動的ライブラリリンク:
実行時にライブラリやビルトインをロードできる機能。

バージョン表記

ksh93は、アルファベット1文字でバージョンを表します。

例:

  • ksh93t+: 2010年3月リリース
  • ksh93u+: 2012年8月リリース(最後のAT&T公式版)
  • ksh93u+m: コミュニティ版の継続開発版

kshの派生版

kshがプロプライエタリソフトウェアだった時期に、いくつかのオープンソース実装が作られました。

pdksh(Public Domain Korn Shell)

パブリックドメインのksh実装です。
多くのBSDやLinuxシステムで使われていましたが、現在は開発が停止しています。

mksh(MirBSD Korn Shell)

pdkshから派生した、自由ソフトウェア実装です。

特徴:

  • MirOS BSDで開発
  • Androidで使用されている(Android 4.0以降)
  • 積極的に開発が継続されている
  • 軽量で高速

その他の派生版

oksh: OpenBSD版KornShellのフォーク(GNU/Linuxのみ)
tksh: ksh93のフォークで、Tkウィジェット・ツールキットへのアクセスを提供
dtksh: CDE(Common Desktop Environment)の一部として配布されたksh93

kshの主な特徴

Bourne Shell完全互換

kshは、Bourne Shellとの完全な上位互換性を持っています。

既存のBourne Shellスクリプトは、修正なしでkshで実行できます。
これにより、既存システムからの移行が容易です。

POSIX準拠

kshはPOSIX.2標準に準拠しています。

実際、ksh88の機能がPOSIX.2標準の基礎となったため、POSIX準拠のシェルスクリプトとの互換性が非常に高いです。

コマンドライン編集機能

kshは、強力なコマンドライン編集機能を持っています。

編集モードの選択:

  • viモード: set -o vi
  • Emacsモード: set -o emacs

viモードの例:

# viモードで履歴を検索
ESC + k  # 前のコマンド
ESC + /  # 検索
i        # 挿入モード

コマンド履歴

kshは、コマンド履歴機能を提供します。

# 履歴の表示
history

# 履歴からコマンドを再実行
r 10     # 10番目のコマンドを再実行
r git    # 最後に実行したgitコマンドを再実行

ジョブコントロール

バックグラウンドジョブの管理機能を提供します。

# バックグラウンドで実行
command &

# ジョブ一覧の表示
jobs

# フォアグラウンドに移動
fg %1

# バックグラウンドに移動
bg %1

エイリアス機能

よく使うコマンドを短縮できます。

# エイリアスの定義
alias ll='ls -la'
alias gs='git status'

# エイリアスの確認
alias

強力なスクリプティング機能

ksh93は、Perlに匹敵する強力なスクリプティング機能を持っています。

配列:

# インデックス配列
set -A array one two three
echo ${array[0]}  # one

# 連想配列(ksh93)
typeset -A map
map[name]="John"
map[age]="30"
echo ${map[name]}  # John

算術演算:

# 整数演算
((result = 10 + 5))
echo $result  # 15

# 浮動小数点演算(ksh93)
typeset -F2 price
((price = 10.99 * 1.08))
echo $price  # 11.87

bashとkshの比較

bashとkshは、いずれもBourneシェル互換の高機能シェルですが、いくつかの違いがあります。

歴史と開発

ksh:

  • 1983年リリース(bashより古い)
  • 商用Unixで標準
  • AT&Tベル研究所で開発

bash:

  • 1989年リリース
  • GNU/Linuxで標準
  • GNUプロジェクトで開発

配列の扱い

ksh:

# 配列の定義
set -A fruits apple banana cherry
# または
fruits=(apple banana cherry)

# 連想配列(ksh93)
typeset -A colors
colors[red]="#FF0000"

bash:

# 配列の定義
fruits=(apple banana cherry)

# 連想配列(bash 4.0以降)
declare -A colors
colors[red]="#FF0000"

関数の定義

ksh:

# function キーワードあり(ksh88スタイル)
function my_func {
    echo "Hello from ksh"
}

# POSIXスタイル
my_func() {
    echo "Hello"
}

bash:

# どちらも使用可能
function my_func {
    echo "Hello from bash"
}

my_func() {
    echo "Hello"
}

print vs echo

ksh:

# printコマンド推奨
print "Hello, World!"
print -n "No newline"  # 改行なし

bash:

# echoコマンドが主流
echo "Hello, World!"
echo -n "No newline"  # 改行なし

パフォーマンス

一般的に、kshはbashよりもスクリプト実行速度が速いとされています。
特に複雑なスクリプトや数値計算を多用する場合、ksh93の方が高速です。

商用Unixでのksh

kshは、多くの商用Unixシステムで標準シェルとして採用されています。

AIX(IBM)

デフォルトシェル: ksh88(/usr/bin/ksh)
拡張版: ksh93(/usr/bin/ksh93)

AIXでは、システムスクリプトの多くがkshで書かれています。

Solaris(Oracle)

デフォルトシェル: Bourne Shell(/bin/sh)
Kornシェル: ksh93(/bin/ksh)

Solaris 11以降では、ksh93が標準のKornシェルです。

HP-UX(Hewlett-Packard)

デフォルトシェル: POSIX Shell(/bin/sh)
Kornシェル: ksh88またはksh93(/bin/ksh)

HP-UXでも、システム管理スクリプトにkshが広く使われています。

kshの使用例

バージョンの確認

# kshのバージョンを確認
ksh --version

# または
echo ${.sh.version}

# 環境変数での確認
echo "$KSH_VERSION"

スクリプトの例

#!/bin/ksh
# kshスクリプトの例

# 変数の定義
name="KornShell"
version=93

# 配列の使用
set -A languages ksh bash zsh

# 関数の定義
function greet {
    print "Hello from $1"
}

# メイン処理
greet "$name"
print "Version: $version"
print "Languages: ${languages[@]}"

# ループ処理
integer i=0
while ((i < ${#languages[@]})); do
    print "$((i+1)). ${languages[i]}"
    ((i++))
done

# 条件分岐
if [[ $version -eq 93 ]]; then
    print "Using ksh93"
else
    print "Using ksh88"
fi

連想配列の例(ksh93)

#!/bin/ksh93
# 連想配列を使った設定管理

typeset -A config
config[database]="localhost:5432"
config[username]="admin"
config[timeout]="30"

# 値の取得
print "Database: ${config[database]}"
print "Username: ${config[username]}"
print "Timeout: ${config[timeout]} seconds"

# 全てのキーを表示
print "\nAll configuration keys:"
for key in "${!config[@]}"; do
    print "$key = ${config[$key]}"
done

浮動小数点演算の例(ksh93)

#!/bin/ksh93
# 消費税計算

typeset -F2 price tax_rate total

price=1000
tax_rate=0.10

((total = price * (1 + tax_rate)))

print "Price: ${price}"
print "Tax rate: ${tax_rate}"
print "Total: ${total}"

kshの利点と欠点

利点

Bourne Shell完全互換:
既存のshスクリプトがそのまま動作します。

強力なスクリプティング機能:
ksh93は、Perlに匹敵する機能を持ちます。

商用Unix標準:
AIX、Solaris、HP-UXなどで標準採用されています。

高いパフォーマンス:
bashと比較して、スクリプト実行速度が速い傾向があります。

POSIX準拠:
移植性の高いスクリプトが作成できます。

欠点

Linuxでの普及度:
GNU/Linuxでは、bashが圧倒的に主流です。

リソースの少なさ:
bashと比較して、オンラインのドキュメントや解説が少ない傾向があります。

学習曲線:
bashに慣れたユーザーにとって、微妙な違いが混乱の原因になることがあります。

派生版の多さ:
pdksh、mksh、ksh93など、複数のバージョンが存在し、互換性に注意が必要です。

まとめ

ksh(Korn Shell)は、1983年にAT&Tベル研究所で開発された高機能Unixシェルです。

Bourne Shellとの完全な互換性を保ちながら、Cシェルの便利な機能を統合し、強力なスクリプティング言語として発展してきました。

kshの主な特徴:

  • Bourne Shell完全上位互換
  • POSIX準拠の標準的なシェル
  • コマンド履歴とジョブコントロール
  • 強力なコマンドライン編集(vi/Emacsモード)
  • ksh93では連想配列と浮動小数点演算をサポート
  • 商用Unix(AIX、Solaris、HP-UX)で標準採用

使い分けの指針:

  • 商用Unixシステム: ksh
  • GNU/Linuxシステム: bash
  • 移植性重視: ksh(POSIX準拠)
  • 最新機能重視: bash、zsh

Linuxでは、bashやzshが主流ですが、商用Unix環境でシステム管理を行う場合、kshの知識は不可欠です。
また、POSIX準拠の移植性の高いスクリプトを作成する際にも、kshは優れた選択肢となります。

参考情報

この記事は以下の情報源を参考に作成しました。

  • Wikipedia「KornShell」(日本語版・英語版)
  • KornShell公式サイト(http://www.kornshell.com/)
  • GitHub「ksh93/ksh」(ksh93u+mプロジェクト)
  • IBM AIX Documentation「Enhanced Korn shell (ksh93)」
  • GeeksforGeeks「Korn Shell Vs Bash Shell」
  • David Korn Interview(Slashdot, 2001)

シェルの使い方については、シェルスクリプトの書き方bashとzshの違いdash(Debian Almquist Shell)Linuxターミナルで使用中のシェルを確認する方法の記事も参考にしてください。

コメント

タイトルとURLをコピーしました