拡張 Korn シェル (ksh93)

AIX® では、デフォルトのシステム Korn シェル (/usr/bin/ksh) に加えて、/usr/bin/ksh93 という拡張バージョンを使用することもできます。 この拡張バージョンには、主に現在のデフォルト・バージョンとの上位互換性があり、さらに、/usr/bin/ksh にはない追加機能がいくつかあります。

一部のスクリプトでは、デフォルトのシェルの下と ksh93 の下とでは動作が異なる場合があります。これは、2 つのシェルの下での変数処理が幾分異なっているためです。

注: rksh93 と呼ばれる、制限付きバージョンの拡張 Korn シェルを使用することもできます。

次の機能は、Korn シェル /usr/bin/ksh では使用できませんが、Korn シェル /usr/bin/ksh93 では使用できます。

項目 説明
演算機能の強化 $ value=$((sqrt(9))) などの演算式を用いて、libm 関数 (一般的に C プログラミング言語で見受けられる数学関数) を使用できます。 単項 +++--、および ?: 構成 (例えば、x ? y : z") に加えて、, (コンマ) 演算子などの算術演算子がさらに使用可能です。 64 基数までの演算基数をサポートしています。 また、浮動小数点演算もサポートしています。 "typeset -E" (指数) を使用して、有効数字の数を指定することができます。また、"typeset -F" (浮動) を使用して、演算変数の小数点の数を指定することができます。 SECONDS 変数は、最も近い秒というよりむしろ、最も近い 100 分の 1 秒を即時表示します。
複合変数 複合変数はサポートされています。 複合変数によって、ユーザーは、複数の変数を単一の変数名で指定することができます。 各変数は、ピリオド (.) を用いて親変数から切り離し、添え字付き変数で割り当てられます。 次に例を示します。
$ myvar=( x=1 y=2 ) 
$ print "${myvar.x}" 
1
複合割り当て 複合割り当ては、インデックス付きアレイと共用のアレイの両方を初期化する場合に、サポートされます。 割り当て値は、以下の例に示すように、括弧内に置きます。
$ numbers=( zero one two three ) 
$ print ${numbers[0]} ${numbers[3]} 
zero three   
共用のアレイ 共用のアレイとは、ストリングをインデックスとして持っているアレイです。
-A フラグとともに使用される typeset コマンドによって、ksh93 内で共用のアレイを指定することができます。 次に例を示します。
$ typeset -A teammates 
$ teammates=( [john]=smith [mary]=jones ) 
$ print ${teammates[mary]} 
jones
変数名リファレンス -n フラグとともに使用される typeset コマンドによって、ある変数名を別の変数名のリファレンスとして割り当てることができます。 このように、ある変数の値を変更すると、同様に、参照されている変数の値も変更されます。 次に例を示します。
$ greeting="hello"
$ typeset -n welcome=greeting     # establishes the reference 	
$ welcome="hi there"              # overrides previous value 	
$ print $greeting 	
hi there   
パラメーター拡張 以下のようなパラメーター拡張の構成が有効です。
  • ${!varname} は変数そのものの名前です。
  • ${!varname[@]}varname アレイ用のインデックスの名前を付けます。
  • ${param:offset}param のサブストリングであり、offset にて開始します。
  • ${param:offset:num}param のサブストリングです。文字の num の数に応じて、offset にて開始します。
  • ${@:offset}offset にて開始するすべての定位置パラメーターを指示します。
  • ${@:offset:num}offset にて開始するすべての num 定位置パラメーターを指示します。
  • ${param/pattern/repl}repl によって置換された pattern が起きたら、最初に param を実行します。
  • ${param//pattern/repl}repl によって置換された pattern が起きるたびに、param を実行します。
  • ${param/#pattern/repl} if parampattern を開始し、その後、paramrepl によって置換されます。
  • ${param/%pattern/repl} if parampattern を終了し、その後、paramrepl によって置換されます。
制御手順関数 制御手順関数は、特定の変数と関連した関数です。 この機能により、変数が参照、設定、または設定解除されるたびに、関数を定義および呼び出すことができます。 これらの関数の形式は varname.function です。varname は変数の名前で、function が制御手順関数です。 定義済みの制御手順関数は getset、および unset です。
  • varname.get 関数は、varname が参照されるたびに呼び出されます。 この関数内に特殊変数 .sh.value が設定された場合は、varname はこの値に変更されます。 簡易例は時刻です。
    $ function time.get 
    > { 
    >     .sh.value=$(date +%r) 
    > } 
    $ print $time 
    09:15:58 AM 
    $ print $time    # it will change in a few seconds 
    09:16:04 AM
  • varname.set 関数は、varname が設定されるたびに呼び出されます。 .sh.value 変数には、割り当てられた値が与えられます。 関数が完了する場合、varname に割り当てられた値が .sh.value の値です。 次に例を示します。
    $ function adder.set 
    > { 
    >   let .sh.value="
    $ {.sh.value} + 1" 
    > } 
    $ adder=0 
    $ echo $adder 
    1 
    $ adder=$adder 
    $ echo $adder 
    2  
  • varname.unset 関数は、varname が設定解除されるたびに実行されます。 変数は、関数内で設定解除されない限り、実際には設定解除されません。そうでない場合、その値を保持します。

すべての制御手順関数において、特殊変数 .sh.name は変数の名前に設定されます。一方、 .sh.subscript は、適用できる場合、添え字付き変数の値に設定されます。

関数環境 function myfunc フォーマットで宣言された関数は、個別の関数環境で実行され、ローカル変数をサポートします。 myfunc() と宣言された関数は、親シェルと同じ環境で実行されます。
変数 .sh. で始まる変数は、シェルによって予約されており、特殊な意味があります。 .sh.name.sh.value、および .sh.subscript の説明に関しては、この表の制御手順関数の記述を参照してください。 シェルのバージョンを示す .sh.version も使用可能です。
コマンドの戻り値 コマンドの戻り値は以下のとおりです。
  • 実行予定のコマンドが見つからない場合、戻り値は 127 に設定されます。
  • 実行予定のコマンドが見つかったが実行不可能な場合、戻り値は 126 です。
  • コマンドは実行されたがシグナルによって終了した場合、戻り値は 256 にシグナル番号をプラスしたものです。
PATH 検索規則 特殊な組み込みコマンドが最初に検索されます。次にすべての関数です (FPATH ディレクトリーの関数を含む)。その後が他の組み込みコマンドです。
シェル・ヒストリー hist コマンドによって、シェル・コマンド・ヒストリーを表示および編集することができます。 ksh シェルでは、fc コマンドを使用します。 fc コマンドは、hist の別名です。 変数は、シェル内でコマンドが実行されるたびに現在のヒストリーを 1 回増分する HISTCMD、ならびに hist コマンドの使用時に使用するエディターを指定する HISTEDIT です。
組み込みコマンド 拡張 Korn シェルには、以下の組み込みコマンドが含まれています。
  • builtin コマンドは、すべての使用可能な組み込みコマンドのリストを作成します。
  • printf コマンドは、printf() C ライブラリー・ルーチンと同じような働きをします。 printf コマンドを参照してください。
  • disown は、指定されたコマンドへ SIGHUP を送信することから、シェルをブロックします。
  • getconf コマンドは、スタンドアロン・コマンドの /usr/bin/getconf と同じような働きをします。 getconf コマンドを参照してください。
  • read 組み込みコマンドには、以下のフラグがあります。
    • read -d {char} によって、デフォルトの改行の代わりに、桁区切り文字を指定することができます。
    • read -t {seconds} によって、read コマンドがタイムアウトになる時間制限を、秒単位で指定できます。 read がタイムアウトになると、FALSE が戻ってきます。
  • exec 組み込みコマンドには、以下のフラグがあります。
    • exec -a {name} {cmd} は、cmd の引数 0 が name によって置換されるように指定します。
    • exec -c {cmd}exec に対し、cmd を実行する前に環境をクリアするように伝えます。
  • kill 組み込みコマンドには、以下のフラグがあります。
    • kill -n {signum} は、プロセスに送信するシグナル番号を指定します。一方、kill -s {signame} は、シグナル名を指定するために使用されます。
    • kill -l は、引数がない場合、すべてのシグナル名のリストを作成しますが、番号のリストは作成しません。
  • whence 組み込みコマンドには、以下のフラグがあります。
    • -a フラグは、検出された最初の一致だけでなく、すべての一致を表示します。
    • -f フラグは whence に対し、いかなる関数も検索しないように伝えます。
  • Escape キャラクター・シーケンスは、print コマンドおよび echo コマンド用に使用されます。 ESC (エスケープ) キーは、シーケンス ¥E によって表示されます。
  • 通常の組み込みコマンドはすべて、特定のコマンドの構文を示す -? フラグを認識します。
  • getopts 組み込みコマンドでは、+ 記号で始まるオプションを許可するために、optstring に先行 + を含める必要があります。
Korn シェル ksh と Korn シェル ksh93 間のその他の各種相違点 その他の相違点を以下に示します。
  • Korn シェル ksh93 では、typeset -fx 組み込みコマンドを使用して関数をエクスポートできません。
  • Korn シェル ksh93 では、alias -x 組み込みコマンドを使用して別名をエクスポートできません。
  • Korn シェル ksh93 では、後に単一引用符 ($') が付くドル記号は、ANSI C 文字列として解釈されます。 古い (ksh) 動作を得るには、ドル記号を引用符で囲む必要があります (¥"$¥"')。
  • Korn シェル ksh93 組み込みコマンドの引数構文解析ロジックは変更されました。 文書化されていない Korn シェル ksh 組み込みコマンドとの引数構文解析の組み合わせは、Korn シェル ksh93 では機能しません。 例えば、typeset -4i の機能は、Korn シェル ksh の typeset -i4 に似ていますが、Korn シェル ksh93 では機能しません。
  • Korn シェル ksh93 の場合、コマンド置換および演算拡張は、特殊な環境変数 PS1、PS3、および ENV で展開中に行われます。 したがって、抑音記号 (`) とドル記号および左括弧記号 ($() は円記号 (¥) を使用してエスケープし、古い動作を保存する必要があります。 例えば、Korn シェル ksh は、文字どおり x=$'name¥toperator'$name¥toperator として割り当て、 Korn シェル ksh93 は ¥t を展開して、name<¥t expanded>operator として割り当てます。 Korn シェル ksh の動作を保存するには、$ を引用符で囲む必要があります。 例えば、x="$"'name¥toperator' です。
  • ERRNO 変数は、Korn シェル ksh93 では除去されました。
  • Korn シェル ksh93 では、ファイル名は、リダイレクト記号の後の非対話式シェル用に展開されません。
  • Korn シェル ksh93 の場合は、alias コマンドの -t オプションを使用して、トラッキングされる別名を表示する必要があります。トラッキングされる別名の機能は現在では廃止されています。そのため、表示された別名はトラッキングされない可能性があります。
  • Korn シェル ksh93 の場合は、emacs モードでの Ctrl+T は、現在の文字と直前の文字を交換します。 ksh の場合、Ctrl+T は、現在の文字と次の文字を交換します。
  • Korn シェル ksh93 では、${name operator value} 内で対になっていない括弧を使用できません。 例えば、両方のバージョンで機能するには、${name-(} に、${name-¥(} のようなエスケープが必要です。
  • Korn シェル ksh93 では、kill -l コマンドでリストされるのは、シグナル名のみであり、その数値はリストされません。