sh - シェルを起動する

形式

[r]sh [±abCefhiKkLmnPprtuvx] [±o option] [cmd_file [argument …]]

[r]sh –S [±abCefhiKkLmnPprtuvx] [±o option] [cmd_file [argument …]]

[r]sh –c cmdstring [±abCefhiKkLmnPprtuvx] [±o option] [cmd_name [argument …]]

[r]sh –s [±abCefhikLmnPprtuvx] [±o option] [argument …]

説明

sh は、以下のトピック およびサブトピックを含みます。
  • オプションおよび起動
  • オプション
  • コマンド構文
  • 予約語コマンド
  • コマンド実行
  • 引用
  • ディレクトリー置換
  • パラメーター置換
  • 算術置換
  • ファイル記述子およびリダイレクト
  • ファイル名の生成
  • 変数
  • シェル変数
  • 自動変換用のシェル変数
  • シェル実行環境
  • 組み込みコマンド
  • シェル・アーカイブ
  • ファイル
  • ローカライズ
  • 終了値
  • メッセージ
  • 制限
  • 移植性
  • 関連情報

置換および入力の変換処理に関するサブトピックは、シェルがこれらの置換および変換処理を実行する順序に並べてあります。

シェルができることの多くは、cdalias のような 組み込みコマンドを通じて提供されます。

制約事項: 自動変換を有効にした状態でタグ付きスクリプトが実行されている場合、ロケールのコード・ページは SBCS である必要があり、スクリプトも SBCS でエンコードされている必要があります。

オプションおよび起動

z/OS® シェルは、Bourne シェルと上向き の互換性があります。

通常、ログインするとシェルが起動します。また、明示的な sh コマンドを入力してもシェルを起動することができます。 sh ファイルを rsh という名前のファイルにコピーすると便利であると考える人もいます。 シェルを rsh という名前で起動すると、シェルは限定モードで動作します。このモードについては、 –r と関連して説明します。

の文字で始まる名前でシェルを起動すると、そのシェルはログイン・シェル になります。(–L オプションでシェルを起動しても、ログイン・シェルが得られます。) ログイン・シェルは、 ファイル /etc/profile を実行すると始まります。 次に $HOME/.profile. コマンド (ドット を参照) を使用して実行します。 HOME が設定されていない場合、シェルは作業ディレクトリーを 検索します。
.profile
このパス名が存在していれば、このファイルを . コマンドで 実行します。これらのファイルが見つからなくても、エラー・メッセージは出ません。

これらのプロファイル・ファイルを使用して、セッションを sh でカスタマイズすることができます。例えば、プロファイル・ファイルは、オプションの設定、別名の作成、または 関数および変数の定義を行うことができます。

sh コマンド行に引数が少なくとも 1 つあれば、sh は、最初の引数を実行するシェル・スクリプトの名前として取り上げます。(例外は –s が使用 された場合です。) 追加の引数はすべて、定位置パラメーターに割り当てられます。通常、これらはシェル・スクリプトの引数として働きます。 定位置パラメーターの詳細は、パラメーター置換 を 参照してください。また、それらのパラメーターを変更するための説明は、set を参照してください。

sh が実行を始めるとき (プロファイル処理の後) に、環境変数 ENV が設定されているのを検出すると、 sh は、この 変数の値を展開して指定されたファイルを実行します。

オプション

シェルは、以下のオプションをコマンド行に受け入れます。
–c cmdstring
cmdstring をシェルの入力行であるかのように実行し、次に終了 します。これは、単一コマンドのためにシェルを呼び出す プログラム (例えば、エディター) によって使用されます。sh は、cmdstring の後ろの 引数を定位置パラメーターに 割り当てます。cmd_name と指定すると、特殊パラメーター 0 がこのストリングに 設定され、cmdstring でコマンドを実行するときに使用されます。
–i
スクリプト実行とは対照的に、対話式シェルを 起動します。–i があると、シェルはキーボードの割り込みを捕らえ、無視します。–i がないと、割り込みによってシェルが終了します。端末から 読み取りを行うシェルでは、–i はデフォルトです。
–L
シェルをログイン・シェル にします。(ログイン・シェルは対話式シェルです。)
–r
限定シェルを起動します。 限定シェルは rsh という名前で起動することもできます。限定シェルにおいては、以下のことはできません。
  • cd コマンドの使用
  • 変数 ENV、PATH、または SHELL の値の変更
  • > または >> を使用する出力 のリダイレクト、または / を含むコマンド名の指定
これらの制限は、ユーザーのプロファイル・ファイル実行中は適 用されません。
–s
標準入力 (stdin) からのコマンドを読み取り、すべての引数を定位置パラメーターに割り当てます。通常、シェルに引数が 1 つ以上ある場合、最初の引数が実行するファイルの名前になります。
–S
環境変数 PATH 内のディレクトリーで、シェル・コマンドを含んでいるファイル cmd_file を検索します。現行作業ディレクトリーは、PATH の前に検索されません。

–c または –s オプションのいずれも指定せずに cmd_file を指定した場合、シェルはそれを実行すべきコマンドを含むファイルの名前として取ります。特殊 パラメーター 0 はこの名前に設定されます。

cmd_file にスラッシュが含まれている場合、シェルはそのファイ ル名の読み取りを試みます。cmd_file にスラッシュが含まれていな い場合には、以下のようになります。
  • –S が指定されている場合、シェルは PATH 内でファイルを検索します。PATH 検索では、そのユーザーに対する実行可能なアクセス許可を持つファイルのみが検出されます。
  • –S が指定されていない場合、シェルは現行作業ディレクトリーで ファイルを検索してから PATH 内で検索します。ファイルは、そのユーザーに対して許可された読み取りアクセスを持っている必要があります。実行可能なアクセス許可は必要ありません。

これらのオプションに加えて、任意の有効なオプションを set コマンド に (–o option を含め)、sh へのコマンド行オプションとして使用する ことができます。詳細については、set を参照してください。

コマンド構文

シェルは、高度なプログラム言語を実装しており、ユーザーに実行の完全な 制御および個別コマンドの組み合わせを与えるものです。シェルが入力を走査する場合、シェルは以下の文字を特別なものとして扱い ます。
;   &   (   )   <   >   |   '   \   "
space   tab   newline
これらの文字のいずれかを実引数の内部で使用したい場合、引数を引用符で (シェルが文字を特別な意味に使用しないように) 囲む必要があります。詳細は、引用を参照してください。

単純コマンド とは、IFS 環境変数の中の文字によって区切られた引数 のリストです (IFS のデフォルト値にはブランク、タブ、および改行が含まれます)。

ワードの前に非拡張ポンド記号 (#) が付いている場合、行の残りはコメント として扱われ、シェルは入力を次の改行まで、次の改行は含 まず、廃棄します。コマンドが定義済みの別名で開始する場合、sh は別名をその定義で 置き換えます (alias 参照)。

予約語コマンドは、予約語 (ifwhile、またはfor) で始まります。 予約後コマンドは、 シェルの制御操作のフローを提供します。これらのリストについては、予約語コマンドを参照してください。

command は、以下のいずれかの形式をとることができます。
command:
  • simple command
  • reserved-word command
  • (command)
  • command |command
  • command &&command
  • command || command
  • command &command
  • command &
  • command |&
  • command ; command
  • command ;
  • command<newline>
以下に、先行演算子の優先順位を示します。最も優先順位の高い演算子が最初にリストされ、同じ行にある演算子は同じ優先順位です。
()
|
&&     ||
&      |&       ;      <newline>
これらの操作の意味は以下のとおりです。
(command)
command を子シェルの中で実行します。現行シェルが 2 番目のシェルを呼び出し、この 2 番目のシェルが実際に command を実行します。このように、command は、完全に別の実行環境で稼働し、作業ディレクトリーの変更、変数の変更、ファイルのオープンなどを、最初のシェルに影響を与えることなく行うことができ ます。子シェルの環境は現行の環境のコピーとして始まるため、子シェルが開始するときは環境変数 ENV の値は実行されません。
|
| 演算子が接続する 2 つの command 間にパイプを作成し ます。最初の command の標準出力が、2 番目の command の標準 入力になります。パイプで接続された一連のコマンドを、パイプライン と呼びます。終了状況は、パイプライン内の最後のコマンドの状況です。
&&
論理 AND 演算子です。シェルは、最初の command が真 (ゼロ) の終了状況を戻した場合に のみ、2 番目の command を実行します。
||
論理 OR 演算子です。シェルは、最初の command が偽 (ゼロ以外) の終了状況を戻した場合に のみ、2 番目の command を実行します。
&
非同期に先行する command を実行します。シェルは、command の実行を開始だけして、command が 実行を終了する前に、ただちに新しい入力を取りに行きます。非同期実行ができないシステムでは、この操作は実質的に ; と等しくなります。
|&
先行する command を共用プロセス (co-process) として 実行します。command は、& 演算子のように非同期に稼働しま すが、コマンドの標準入力および標準出力は、パイプでシェルに接 続されています。シェルは、入力を command の標準入力 に print –p コマンドで送り 、command の標準出力から read –p コマンドで 読み取ります。command は、その出力をバッファーに入れてはなりません。この理由およびその他の制限から、共用プロセスは共用プロセスとして使用するよう に設計する必要があります。非同期実行ができないシステムでは、共用プロセスはサポートされていません。
;
順次実行演算子です。2 番目の command は、最初の command が完了 した後でのみ実行されます。
newline
非拡張改行は、; 演算子と同じです。

予約語コマンド

シェルには、豊富な予約語コマンド のセットが用意されています。これらのコマンドを使用すると、制御フローが提供され、複合コマンドを作成することができます。以下のリストでは、command は、改行で区切られた command のシーケンスでもあります。大括弧 ([ ]) は、コマンドのオプション の部分を示すもので、コマンド構文の一部として含められます (ただし、[[ test_expr ]] の場合 は例外で、この場合、大括弧はコマンドの一部です)。
!
感嘆符は、論理 NOT コマンドです。オペランドが偽 (ゼロ以外) の場合、このコマンドは真 (ゼロ) を戻します。オペランドが真 (ゼロ) の場合、このコマンドは偽 (ゼロ以外) を戻します。
{command;}
コマンドを中括弧で囲むのは、シェルが command を子シェルの下ではなく、同じ環境で実行することを除き、(command) 構成に類似して います。{} は、 シェルの予約後です。シェルに これらのシンボルを認識させるには、ブランクまたは改行 を { の後に入れ、セミコロンまたは改行 を } の前に入れる必要があります。
[[ test_expr ]]
二重大括弧コマンド ([[ test_expr ]]) は、test_expr (テスト式) が真か 偽かを示した終了状況を戻すコマンドです。

ワードの分割およびワイルドカード拡張 (ファイル名拡張またはグロビング) は、[[ ]] 内では行われません。これにより、test (または [ ]) コマンドを使用する場合よりも、引用符で囲む必要性が少なくなります。 別名の拡張も [[ ]] 内では行われ ません。

([[ test_expr ]]) 内では 以下のプリミティブが使用されます。演算子とオペランドを分離させるた めには、スペースまたはタブが必要です。

–a file
file が存在する場合、真 (test コマンド構文 と混乱しないようにするためには、–e をお勧めします)。
–Aa file
file が拡張アクセス ACL エントリーの場合、真。
–Ad file
file がディレクトリーのデフォルト ACL の場合、真。
–Af file
file がファイルのデフォルト ACL の場合、真。
–b file
ファイルがブロック・スペシャル・ファイルの場合、真 (ブロック・スペシャル・ファイルは z/OS ではサポートされていません)。
–B file
file がバイナリー (非テキスト) としてタグ付けされている場合、真。
–c file
file がキャラクター型スペシャル・ファイルの場合、真。
–d file
file がディレクトリーの場合、真。
–e file
file が存在する場合、真。
–Ea file
file が APF 拡張属性を持っている場合、真。
–El file
file が共用ライブラリー拡張属性を持っている場合、真。
–Ep file
file がプログラム制御拡張属性を持っている場合、真。
–Es file
file が共用アドレス・スペース拡張属性を持っている場合、真。
–f file
file が通常ファイルの場合、真。
–g file
file のグループ ID 設定属性がオンの場合、真。
–G file
グループ所有者が実効グループ ID である場合、真。
–h file
file がシンボリック・リンクの場合、真。
–k file
file のスティッキー・ビットがオンの場合、真。
–L file
file がシンボリック・リンクの場合、真。
-Ma ファイル
ファイルがセキュリティー・ラベルを持っている場合、真。
–n string
string の長さがゼロより大きい場合、真。
–o option
シェル・オプション (option) がオンの場合、真。
–O file
file の所有者が実効ユーザー ID の場合、真。
–p file
file が FIFO (名前付きパイプ) の場合、真。
–r file
file が読み取り可能な場合、真 (許可ビットとア クセス制御を検査します)。
–s file
file のサイズがゼロ以外の場合、真。
–S file
file がソケットの場合、真。
–t fd
数値のファイル記述子 fd が開かれており、端末と関連している場合、真。
–T file
file がテキストとしてタグ付けされている場合、真。
–u file
file のユーザー ID 設定属性がオンの場合、真。
–w file
file が書き込み可能な場合、真 (許可ビットとアクセス 制御を検査します)。
–x file
file が実行可能な場合、真 (許可ビットとアクセス制御 を検査します)。
–z string
string の長さがゼロの場合、真。
string
string がヌル・ストリングでない場合、真。
string = pattern
string が pattern と一致する場合、真 (test コマンド構文と混乱しないようにするためには、== をお勧めします)。
string == pattern
string が pattern と一致する場合、真。ストリングとして扱うためには、パターンを引用符で囲みます。 パターンについては、ファイル名の生成を参照してください。
string1 != pattern
string が pattern と一致しない場合、真。 パターンについては、ファイル名の生成を参照してください。
string1 < string2
現行ロケールで定義された照合シーケンスで string1 が string2 より前に ある場合、真。
string1 > string2
現行ロケールで定義された照合シーケンスで string1 が string2 より後に ある場合、真。
exp1 –eq exp2
演算式 exp1 と exp2 が等しい場合、真。
exp1 –ge exp2
演算式 exp1 が exp2 より大きいかまたは等しい場合、真。
exp1 –gt exp2
演算式 exp1 が exp2 より大きい場合、真。
exp1 –le exp2
演算式 exp1 が exp2 より小さいかまたは等しい場合、真。
exp1 –lt exp2
演算式 exp1 が exp2 より小さい場合、真。
exp1 –ne exp2
演算式 exp1 が exp2 と等しくない場合、真。
file1 –nt file2
file1 が file2 より新しい場合、真。
file1 –ot file2
file1 が file2 より古い場合、真。
file1 –ef file2
file1 が file2 へのハード・リンクまたはシンボリック・リンクである場合、真 (これは、z/OS 上でハード・リンクの有無だけをテストする test コマンドとは異なります)。
file–CS codeset
file がコード・セットを指定してタグ付けされている場合、真。
file -Ml seclabel
ファイルがセキュリティー・ラベルを持っている場合、真。ファイルがセキュリティー・ラベルに一致するセキュリティー・ラベルを持っていない場合、偽。
( test_expr )
通常の優先順位を変更するためのグループ化。test_expr が真の 場合、真。
! test_expr
論理否定。test_expr が偽の場合、真。
test_expr1 && test_expr2
論理 AND。test_expr1 と test_expr2 の両方が真の場合、真。
test_expr || test_expr2
論理 OR。test_expr1 または test_expr2 のいずれかが真の場合、真。

二重大括弧条件の中でテストされるパタ ーンは、特殊文字と正規文字から構成されます。パターンは ファイル名の生成に示されている規則に従います。ただし、ピリオド (.) とスラッシュ (/) が特別に扱われることはありません。 パターンのマッチングは正規表現処理に似ていますが、構文が異なります。

case word in [(][pattern[|pattern] &… )command ;;] … [(][pattern[| pattern] … )command ;; ] … esac
case ステートメントは、C プログラミング言語の switch ステートメントまたは Pascal の case ステートメントに類似しています。 ある特定の word が、“or” バー (|) 文字で区切ら れたパターンのどれか 1 つに一致すると、sh は対応する command を実行します。 パターンは ファイル名の生成に示されている規則に従います。ただし、ピリオド (.) とスラッシュ (/) が特別に扱われることはありません。 パターンは並んでいる順序でマッチングされます。command を区切り、次の pattern を取り入れるには、二重セミコロン (;;) を使用する必要があります。
for variable [in word …] do command done
for ステートメントは、variable をそれぞれの word 引数に順番に設定し、command の組み合わせを それぞれの variable の設定に対して一度実行します。in word 部分を省略すると、shvariable をそれぞれの定位置パラメーターに設定します。 break または continue ステートメントでループ内の 制御のフローを方向転換することができます。
function variable { command ... } ... variable() { .. }
これらの形式のいずれかで variable という function が定義され、 その本体は commands のシーケンスから構成されます。 関数はほかのコマンドと同じように起動します。 つまり、実際に関数を呼び出すと sh が現行の定位置パラメーターを保管します。 このとき、 この関数のコマンド行の引数が、この関数が終了するまで これらのパラメーターを置き換えます。 sh は、set コマンド指定の EXIT によって操作される すべてのフラグに加えて、現行の ERR および EXIT トラップも 保管します。これらは関数の終了時に復元されます。 関数は、関数本体のコードが終わるか、 または return ステートメントに達すると終了します。 関数が typeset を使用して、 関数本体のすべての変数を宣言する場合は、 変数は関数に対してローカルです。
if command then command [elif command then command] … [else command] fi
if ステートメントでは、最初 (左端) の command が正常に終了する (ゼロ終了状況を戻す) と 、sh は、then に続く command を実行します。それ以外の場合、sh は、elif (「else if」の短縮形) に続く command (もしあれば) を実行します。 それが正常に終了すると、sh は、次の then (もしあれば) に続く command を実行します。 いずれのケースも正常に終了しなかった場合 、sh は、else (もしあれば) に続く command を実行します。
select variable [in word …] do commands done
select ステートメントは、ユーザーとのメニュー形式の対話を処理することができます。 その構文は、for ステートメントに似ています。それぞれの word は、標準エラー・ファイル上に 1 行に 1 つずつ 番号付きで出力されます。「in word …」部分を省略すると、sh は定位置パラメーターを使用します。sh は次に、変数 PS3 の 値を表示して、ユーザーに数値の応答を入力するようにプロンプトを出しま す。応答が空の行の場合は、sh は再びメニューを表示します。空でなければ、sh はその入力行を変数 REPLY に割り当て、variable を選択した word に設定し、次に commands を実行します。sh は、割り込み、ファイルの終わり、または commandsbreak ステートメントによって ループが終了するまで、何回でも繰り返します。
until command1 do command2 done
until ステートメントは、command1 を実行し、終了状況の成功 (ゼロ) または失敗 (ゼロ以外) を検査します。command1 が正常に終了すると、ループは終了します。それ以外の 場合、shcommand2 を実行してから、再び command1 の実行と検査に戻ります。commands の中 の breakcontinue コマンドは、ループの動作に影響します。
while command1 do command2 done
while ステートメントは、until ステートメントと 同様な働きをします。 しかし、ループは command1 が不成功 (ゼロ以外の終了状況) の場合は いつでも終了します。
シェルの予約語が認識されるのは、それらがコマンドの最初の引用符なしトークンの場合 のみです。これにより、ユーザーは、これらの予約語を引数として、シェルから実行する コマンドに渡すことになります。予約語の全リストを以下に示します。
!           done        function        while
[[          elif        if
{           else        select
}           esac        then
case        fi          time
do          for         until

コマンド実行

単純コマンド を実行する前に、シェルはコマンド行を処理して、展開、割り当て、およびリダイレクトを実行します。

最初に、sh はコマンド行を調べて、 演算子 またはワード のいずれかである一連のトークン に分割します。演算子は、制御演算子 (コマンド構文を参照) か、またはリダイレクト演算子 (ファイル記述子およびリダイレクトを参照) です。演算子以外のトークンはすべてワードです。

次に、シェルは以下の順序でワードを展開します。

  1. sh は、ディレクトリー置換を実行します。
  2. sh は、ワードがコマンド行に現れる順序で、それぞれの ワードをフィールド に展開しながら、パラメーター置換、コマンド 置換、または算術置換を実行します (適切なトピックを参照)。
  3. sh は、IFS 環境変数からの 引用符なし文字のステップ 2 で作成した各フィールドを走査して、 このフィールドをさらに 1 つ以上の新しいフィールドに分割します。
  4. sh は、別名をそれらの定義に展開します。
  5. sh は、ステップ 3 の引用符なしフィールド上でパス名の展開を行います。
  6. sh は、オリジナルのワードに提示されたすべての 引用符メカニズム (¥'、および ") を 除去します。ただし、それら自身に引用符が付いていれば、除去しません。

シェルは、展開された結果の最初のフィールドをコマンドとみなします。

展開された単純コマンドには、変数割り当ておよびリダイレクトが入っている ことがあります。変数割り当ては現行の実行環境に影響します。展開の後、シェルはすべてのリダイレクト構成を処理します。そして、コマンドが検出されていれば、子シェル環境でリダイレクトを実行します (シェル実行環境 を参照)。

単純コマンドがコマンド名を含む場合、コマンドの中の変数割り当てはそのコ マンドの実行にのみ影響します。

シェルが単純コマンドの適切な引数すべてを展開した後、しかもシェルがファイル名の生成を実行する前に、シェルはコマンド名 (コマンドにコマン ド名がある場合) を調べます。sh は、最初にそれらの名前を現在定義されている別名 (alias コマンドを参照) および関数 (予約語コマンドfunction を参照) と照合し、 最後にプログラム・ファイルを検索せずにそのシェルが直接実行可能なコマンドである組み込みコマンドのセットと照合します。

autoload コマンドは typeset –fu の別名で、まだ定義されていない関数を識別します。未定義の関数がシェル内で初めて呼び出されると、シェルは、関数と同じ名前を持つファイルがないか、FPATH シェル変数の中のディレクトリーを検索します。 一致するファイルがあれば、その中に同じ名前の関数定義が含まれていると 想定されます。そのファイルが読み取られ、現行シェル環境で実行され、その後の実行のた めに関数がシェルのメモリーに保管されます。(複数の関数定義が同じファイルに入れられている場合があります。そのファイルがシェルによって処理されると、すべての関数が定義されるこ とになります。ファイル内の関数定義はすべて、ファイルへのリンク名でなければなりませ ん。)

コマンドが組み込みコマンドまたは関数であれば、シェルはそのコマンドを 実行します。

コマンド名が関数または組み込みコマンドでない場合、z/OS シェルは、そのコマンドの実行可能バージョンを含むプログラム・ファイルまたは スクリプト・ファイルを探します。シェルは、以下の手順を使用して、プログラム・ファイルを見つけます。
  • シェルに入力されたコマンド名にスラッシュ (/) 文字が入っ ている場合、コマンドは絶対パス名 (絶対または相対) であると見なされます。シェルは、そのファイルの内容を実行しようとします。
  • それ以外の場合、シェルはパス検索を実行します。これを行うために、シェルは環境変数 PATH の値を 入手します。この値はディレクトリー名のリストでなければなりません。sh は、各ディレクトリーのもとで、コマンド名と一致する名前のファイルを探します。FPATH シェル変数が設定されていれば、シェルは PATH および FPATH デ ィレクトリーを検索します。コマンド名と一致する名前のファイルが PATH と FPATH の両方で同じディレクトリー内に見つかるか 、または一致するファイルが FPATH だけで見つかっ た場合は、このファイルが読み取られ、現行シェル環境で実行されます (フ ァイルに含まれている関数が定義されます)。その後、シェルはコマンド名と一致する関数を実行します。これにより、ユーザーは、autoload コマンドですべての関数を識 別しなくても、FPATH を使用して関数を探し出すこ とができます。

    FPATH が設定されていないか、またはコマンドが FPATH 内に見つからない場合、シェルは、PATH ディレクトリーで最初に見つかった一致 するファイルを実行します。PATH 変数の指定に関する詳細は、「z/OS V2R2.0 UNIX System Services ユーザーズ・ガイド」で、コマンドの検索パスをカスタマイズする際の PATH 変数の使用に関するトピックを参照してください。

コマンド名は トラックされる別名 として、マーク付けすることができます。 トラックされる別名をもつコマンドを最初に実行する場合、シェルは通常の PATH 検索を行います。検索が成功すると、シェルは検出したファイルを記憶しておきます。次回同じ名前のコマンドを実行する 場合、sh は、最後の PATH 検索で検出したファイルをただちに実行します。新規の検索 はありません。これにより、シェルが適切なファイルを検出するスピードが上がります。

set –h コマンドは、すべてのコマンドをトラックされた 別名として扱うようシェルに指示します。詳細については、alias および set を参照してください。

引用

あるワード または特殊文字の特殊な意味を変更できるように、シェルは引用メカニズムをいくつか備えています。一般に、文字の前に円記号 (¥) を入れることによ って、任意の文字の特殊な意味を除くことができます。こうすることを、文字をエスケープ すると言います。

例えば、行の末尾に円記号を入れることによって、シェルに対して改行文字の特殊な意味を無視するよう指示することができます。シェルは エスケープされた改行を無視して、入力の次の行を現在行の終わりに結合します。このようにして、長い行を使いやすく、読みやすい形で入力することができます。

円記号を文字の前に入れて文字をエスケープするというのは、シェ ルに特殊な意味を無視するように指示する最も直接的な方法です。しかし、この方法は、いくつかの文字をエスケープする場合には、扱いにくく、分かりにくいことがあります。

代わりに、引数をさまざまなタイプの引用符の中に入れることができます。引用符文字は、それぞれが異なる「強さ」を持っています。単一引用符は、最も強い引用符です。コマンド行の引数を単一引用符で囲んだ場合、シェルは単一引用符内のすべての文字の特殊な意味を無視します。例えば、以下のとおりです。
 echo
'*'

二重引用符はより弱くなります。二重引用符内では、シェルはコマンド置換 (コマンド置換を参照)、パラメーター置換 (パラメーター置換を参照)、および算術置換 (算術置換を参照) を実行します。シェルは、単一引用符内においては、このような置換を実行しません。二重引用符内にある場合には 、円記号を使用して別の文字をエスケープする ことができますが、単一引用符内では、シェルはこの特殊な意味を無視します。

シェルは、内部フィールド分離文字 (すなわち、IFS 変数の値の 中の文字) を文字通り内部引用符付き引数として扱います。二重引用符また は単一引用符のいずれが付いていてもです。これは、たとえ引用符付き 引数が IFS 文字を含んでいても、単一エンティティーと見なされることを意味しています。

引用符で囲むと、予約語および別名の特殊な意味を変更することができます。例えば、
"time" program
time を囲む引用符は、シェルに time をシェルの予約語として解釈しないように 指示することになります。代わりに、sh は通常のコマンド検索を行い、time という名前の コマンドを探します。
以下の文字を sh に文字通りに解釈させたい場合は、文字を引用符 で囲む必要があります。
|   &   ;   <   >   (   )   $    '   "   `   \
<space>  <tab>  <newline>
以下の文字を文字通りに解釈させたい場合、あるコンテキストにおいては文字を引用符で 囲むことが必要です。
*   ?   [   #   %   =
 ~

ディレクトリー置換

ワードが引用符なし波形記号 (~) で始まっている場合、sh はそ のワードについてディレクトリー置換を実行しようとします。sh は、波形記号 (~) から最初のスラッシュ (/) までのすべての文字を入 手し、これをユーザー名 として使用します。sh は、この名前をユーザー・プロファイル、システムのすべてのユーザーについての情報を含むファイルを捜します。一致する名前を見つけると、sh は、~name を、一致する RACF® ユーザー・プロファイル項目に示されている、ユーザーのホーム・ディレクトリー の名前で置き換えます。

例えば、ファイル名を以下のように指定したとします。
 ~jsmith/file
sh は、jsmith のホーム・ディレクトリーを検索して、そ のディレクトリー名を ~jsmith 構成の代わりに入れます。
名前を後ろに付けずに ~ を指定すると、sh は、~ を HOME 変数の現行値で置き換えます。例えば、以下のとおりです。
echo ~
ホーム・ディレクトリーの名前が表示されます。同様に、sh は ~+ を PWD 変数 (作業ディレクトリーの名前) の値で置き換え、波形記号とハイフン (~–) を OLDPWD (前の作業ディレクトリーの名前) の値で置 き換えます。変数割り当てにおいては、波形記号による展開は、コロン (:) の後でも実行さ れます。

パラメーター置換

シェルは、定位置パラメーター、特殊パラメーター、および変数の 3 つのタイプのパラメーターを使用します。定位置パラメーターは、単一の数字 (0 を除く) または括弧の中のいずれか 以上の数字のいずれかで表されます。例えば、7 および {15} は両方とも定位置パラメーターとして 有効な表示です。定位置パラメーターは、sh を呼び出すときに、コマンド行から 値を割り当てられます。

特殊パラメーターは、以下の文字の 1 つで表されます。
*    @    #    ?    !    -    $     0
特殊パラメーターが展開する値は、次の段落にリストされています。

変数とは、名前付きパラメーターのことです。変数の命名および宣言については、変数 を参照してください。

パラメーターをコマンド行で使用する最も単純な方法は、ドル記号 ($) の後にパラメーターの名前を続けて入力することです。例えば、次のようにコマンドを入力すると、
echo $x
sh は、$x をパラメーター x の値と置き換え、次に結果 を表示します (echo がその引数を表示するため)。パラメーターを展開するその他の方法は、以下の段落に示してあります。
以下のパラメーターがシェルに組み込まれています。
$1, $2, … $9
d 定位置パラメーター (ここで、d$ に続く単一の数字) に展開します。このようなパラメーター がない場合、d はヌル・ストリングに展開します。
$0
シェルの名前、シェル・スクリプト、またはシェルを呼び出した ときに割り当 てられた値に展開します。
$#
定位置パラメーターの数に展開します。
$@
定位置パラメーターの完全なリストに展開します。$@ が引用符付きの場合、結果は別々の引数で、それぞれが引用符付きです。これは、
"$@"
は、以下と同等です。
"$1" "$2" …
$*
定位置パラメーターの完全なリストに展開します。$* が 引用符付きの場合、結果は単一の引数に連結され、パラメーターは IFS の値の先頭文字で 区切られます (変数を参照)。例えば、IFS の先頭文字がブランクの場合、以下の 2 つは同等です。
"$*"
は、以下と同等です。
"$1 $2 …"
$–
直前の set コマンドの呼び出しから、および sh コマンド行のオプションから、有効であるすべてのオプションに展開します。
$?
実行された最後のコマンドの終了状況に展開します。
$$
シェルのプロセス ID に展開します。子シェル環境で実行している場合 (シェル実行環境を参照) は、 親シェルのプロセス ID です。それ以外の場合は、現行シェルのプロセス ID です。
$!
最後の非同期コマンドのプロセス番号に展開します。

これらの構成は、シェルのパラメーター と呼ばれています。構成には、定位置パラメーターが含まれますが、定位置パラメーターに限定さ れているわけではありません。

今までに、$ をパラメーター名の前に付けることによってパラメーターを展開できる ということを説明してきました。パラメーターを展開するもっと洗練された方法があるので 以下に示します。
${parameter}
任意のパラメーターを展開します。
${number}
与えられた数で定位置パラメーターに展開します。($d とだけ入力して d 番目の 定位置パラメーターを参照する場合、d には単一の数字のみ入りますが、中括弧を用いる と、number には 9 より大きい数字が使用できることを思い出してください。) 中括弧は 名前の始めと終わりを示すので、文字または数字を式のすぐ後に入れることができます。
${variable[arithmetic expression]}
variable という名前の配列の中のエレメントの値に展開します。arithmetic expression は、配列の添え字を与えます。(算術置換を参照。)
${variable [*]}
配列 variable の中のすべてのエレメントに展開します。それぞれのエレメント は、$IFS の値の先頭文字で区切られます。
${variable [@]$}
引用符なしの場合は、${ variable[*]} と同じです。 “${variable [@]$} ,” のように引用符を付けた場合は、配列 variable 内のすべてのエレメントを、 それぞれ引用符付きで展開します。
${#parameter}
与えられた parameter の値の中の文字数に展開します。
${#}
定位置パラメーターの数に展開します。
${# *}
定位置パラメーターの数に展開します。
${#@}
定位置パラメーターの数に展開します。
${#variable [*]}
variable という名前の配列の中のエレメント数に展開します。割り当て値を持たないエレメントはカウントされません。例えば、エレメントの 04 のみに値を割り当てた場合、エレメントの数は 2 となります。エレメントの 1 から 3 はカウントされません。
${parameter:–word}
parameter が定義されていて、空でない値が入っている場合、その値に展開します。それ以外の場合は、word に展開します。これは、パラメーターが定義されていない場合に、word をデフォルト値として使用できる ということを意味します。
${parameterword}
パラメーターが定義されていれば、たとえ空でも展開されるということを除 いて、前の構成と似ています。
${variable:=word}
word をパラメーター拡張で展開し、結果を variable に割り当てます。ただし、variable が定義されていないか、または空の値が入っているということを前提とします。結果は、word が展開されたか 否かにかかわらず、variable の拡張です。
${variable=word}
展開すべき word に対して、variable が 未定義 (単にヌルではだめ) でなければ ならないということを除いて、前の構成と似ています。
${parameter:?word}
parameter の値に展開します。ただし、パラメーターが定義され、空 でないことを前提とします。parameter が定義されていないか、または ヌルの場合、shword をメッセージとして展開し、表示します。word が空の場合 、sh はデフォルトのメッセージを表示します。非対話式シェルがメッセージを表示した後、sh は終了します。
${parameter?word}
shwordparameter が未定義の場合にの み表示することを除いて、前の構成に似ています。
${parameter:+word}
word に展開しますが、parameter が定義され、空 でないことが前提です。
${parameter+word}
parameter が定義されている場合、word に展開します。
${parameter#pattern}
pattern を指定された parameter の値とマッチン グさせようとします。pattern は case pattern と同じです。sh は、pattern に一致する parameter の最も短い接頭部値を検索します。sh が一致を検出しなかった場合、直前の構成が parameter の値に展開します。それ以外の場合、pattern と一致した値の部分は拡張から削除されます。
${parameter##pattern}
sh が、このような一致を検出した場合、pattern と一致 する最も長い部分を削除することを除いて、前の構成と似ています。
${parameter%pattern}
pattern と一致する parameter の値の最も短い接尾部を 検索し、一致しているストリングを拡張から削除します。
${parameter%%pattern}
sh が、このような一致を検出した場合、pattern と一致 する最も長い部分を削除することを除いて、前の構成と似ています。

算術置換

算術置換は、以下の構文
$((arithmetic expression))
または
$[arithmetic expression]
で使用可能です。このシーケンスは、arithmetic expression の値で置き換えられ ます。算術式は、展開済み変数、数値定数、および演算子から構成されています。数値定数には次の形式があります。
  • 0x で始まる数は 16 進数です。
  • 0 で始まる数は 8 進数です。
  • 0x または 0 で始まっていない数は 10 進数です。
  • base #number。ここで、base は 2 と 36 の間 (2 および 36 を含む) の 10 進整数で あり、number は、与えられた基数 (base) での任意の非負数です。
未定義の 変数はゼロに評価されます。

シェル変数 x に有効な整定数を形成する値が含まれる場合、算術式展開 "$((x))" および "$(($x))"、あるいは $[x] または $[$x] によって同じ値が返されます。

以下に演算子を優先順位の高いものから順にリストします。ヘッダーを共用している 演算子は同じ優先順位です。同じ優先順位グループの中の評価は、左から右です。ただし、割り当て演算子は右から左に評価されます。

単項演算子:
 -
単項マイナス
!
論理否定
+ ~
一致、ビット単位の否定
乗算演算子:
* / %
乗算、除算、剰余
加算演算子:
+ -
加算、減算
ビット単位シフト演算子:
<< >>
ビット単位右シフト、ビット単位左シフト
関係演算子:
< >
より小さい、より大きい
<= >=
より小か等しい、より大か等しい
= = !=
と等しい、と等しくない
ビット単位 AND/OR 演算子:
&
かつ
^
排他 OR
|
包含 OR
論理 AND/OR 演算子:
&&
論理 AND
||
論理 OR
? :
If-else
割り当て演算子:
&&
論理 AND
= *= /= %=
割り当て
+= -= <<=
割り当て
>>= &= ^= |=
割り当て
以下の状態の算術式は、$(( )) 構文で囲む必要ありません。
  • 整数変数への割り当てで (typeset 参照)。
  • 後続の組み込みシェル・コマンドへの引数として。
    break          exit         return continue       let          shift
  • テスト組み込みシェル・コマンド 数値比較の引数 (–eq–ge–gt–le–lt、および –ne) として使用されるとき。test を参照してください。

コマンド置換

コマンド置換 では、sh は、sh は、コマンド行の 1 つのコマンドの標準出力の拡張を、2 番目 のコマンド行の代わりに使用します。2 つの構文があります。

最初の構文 (逆引用符 と呼ばれる) では、次のようにコマンドを抑音符号 ` で囲みます。
ls `cat list`
このコマンド行を処理するには、sh はまず cat コマン ドを実行し、その標準出力を収集します。次にシェルは、この出力を引数に分割し、結果を ls コマンドのコマンド行に入れます。したがって、直前のコマンドは、名前がファイル・リスト に含まれているすべてのファイルの属性をリストします。
この構文は入力しやすいのですが、コマンド置換を別のコマンド 置換 (ネスト・コマンド置換) に入れたい場合には役に立ちません。役に立つ構文は、
$(command)
で以下のように使います。
ed $(grep –f –l function $(find . –name '*.c'))
このコマンドは find を使用して現行ディレクトリーおよび そのサブディレクトリーを検索し、名前が .c で終わるファイルすべてを検出します。次に grep –f を使用して、ストリング function を含む このようなファイルを検索します。最後に ed を呼び出し、このようなファイルをそれぞれ編集します。
逆引用符構文には歴史的な矛盾があります。逆引用符付きコマンド内部の 円記号 (¥) は、コンテキストによって解釈 が異なります。円記号は、ドル記号 ($)、アクサングラーブ (`) ま たは別の円記号 (¥) の前にない限り 文字どおりに解釈されます。これらの場合には、先行円記号はエスケープ文字となり 、$` または ¥ を文字どおりに解釈させます。 したがって、システム・レベルで出されたコマンド
echo '¥$x'
は、以下を出力します。
¥$x
一方、逆引用符構文に同じコマンド
echo `echo '¥$x'`
を出した場合、以下を出力します。
$x
コマンド置換には $(command) 構文をお勧めします。

sh は、コマンドを実行するために、あたかもシェルの新しいコピーが呼び出されたかのように、コマンド置換を実行します。これによって、$- (シェルに渡すオプションのリストを表す) の 働きに影響を与えます。コマンド置換に $- が入っている場合、$- の展開は 、–i オプションを含みません。コマンドは、非対話式シェルによ って実行されているからです。

ファイル記述子およびリダイレクト

シェルは時々、ファイル記述子 を使用してファイルを参照します。 ファイル記述子は、0 から 9 までの範囲の数です。 任意の桁数を使用できます。例えば、ファイル記述子 00101 は、ファイル記述子 1 と同じことです。さまざまな操作 (例えば、exec) がファイル記述子を特定のファイルと関連付ける ことができます。

ファイル記述子の一部は、シェルの開始時に設定されます。以下は標準入出力ストリームです。
  • 標準入力 (ファイル記述子 0)
  • 標準出力 (ファイル記述子 1)
  • 標準エラー (ファイル記述子 2)
シェルの下で実行中のコマンドもこれらの記述子およびストリームを使用す ることができます。シェルの下でコマンドが稼働する場合、ストリームは通常ユーザーの端末と 関連しています。しかし、これらのファイル記述子をリダイレクトして他のファイルに関連付ける ことができます (ストリームの I/O がユーザーの端末の代わりに関連したファイルで行われるように するためです)。実際のところ、シェルは、ファイル記述子 0 から 9 と関連した I/O ストリームをリダイレクトさせるのに、以下のコマンド行構成を使用しています。
number<file
番号が number であるファイル記述子の入力用に file を使用します。number を省略して <file のようにすると、デフォルトは 0 となり、標準入力がリダイレクトされます。
number>file
番号が number であるファイル記述子の出力用に file を使用し ます。number を省略して >file のようにすると、デフォルトは 1 となり、標準出力がリダイレクトされます。ファイルが存在していない場合、シェルはファイルを作成します。ファイルがすでに存在し、noclobber が 設定 (set 参照) されている場合、リダイレクトは失敗します。
number>|file
number>file に似ていますが 、file がすでに存在する場合、ファイルに書き込まれる出力は現行の 内容を上書きします。
number< >file
番号が number であるファイル記述子の入出力用 に file を使用します。これは、ファイルが別の端末またはモデム回線の場合に 最も役に立ちます。number を省略して < >file の ようにすると、number はデフォルトでゼロとなり、標準入力がリダイレクトされます。ファイルに書き込まれる出力は、ファイルの現行の内容 (もしあれば) を上書きします。ファイルが存在していない場合、シェルはファイルを作成します。
number>>name
出力がファイルの現行の内容 (もしあれば) に追加されることを除いて 、number > file と似ています。
number<<[-]name
ユーザーの端末から (またはシェル・スクリプトの本文から) コマンドに対する入力を指定でき ます。この表記法は、here ドキュメント として知られています。シェルは、与えられた name と一致する行を検出するまで、標準入力から読み取り、それをファイル記述子 number に入力として送ります。number を省略した場合、デフォルトは標準入力です。例えば、以下のコマンドの場合、
cat <<abc >out
シェルは、abc というワードからなる行が入力されるまで、端末から 入力を読み取ります。この入力は、標準入力として cat コマンドに渡され、cat コマンドは 次に、テキストをファイル out にコピーします。
name の文字のどれかが引用符付きまたはエスケープされていると 、sh は、入力の置換を実行しません。代わりに、通常の引用符お よびエスケープ規則に従って、変数およびコマンド置換を実行します。-name の前に置くと 、shhere ドキュメント のすべての先行タブを削除します。
number1<&number2
入力ファイル記述子 number1 を ファイル記述子 number2 の複写にします。number1 を省略した場合、デフォルトは 標準入力 (ファイル記述子 0) です。例えば、<&4 は、標準入力をファイル記述子 4 の複写にします。この場合、4 に入力することと標準入力 (stdin) に 入力することとは同じ効果があります。
number1>&number2
出力ファイル記述子 number1 を ファイル記述子 number2 の複写にします。number1 を省略した場合、デフォルトは 標準入力 (ファイル記述子 1) です。例えば、>&2 は、標準出力をファイル記述子 2 (標準エラー) の複写にします。この場合、stdout の書き込み出力は stderr の書き込み出力と同じ 効果をもちます。
number<&-
入力記述子 number をクローズします。number を省略すると、標準入力をクローズします。
number>&-
出力記述子 number をクローズします。number を省略すると、標準出力をクローズします。

通常、リダイレクトは、リダイレクト構成が現れるコマンドにのみ適用され ます。ただし、exec を参照してください。

リダイレクト 指定の順序は意味を持っています。前の方に出てきたリダイレクトが 後のリダイレクトに影響することがあるからです。しかし、これらの指定は、他のコマンド引数と自由に混ぜることができます。リダイレクトはシェルが管理しているため、リダイレクト構成はコマンド自体に渡されることはありません。
注: シェルは、パイプラインに必要な暗黙のリダイレクトを実行してから、明示のリダイレクトを実行します。

ファイル名の生成

文字 * ? [ は、グロブ文字 またはワイルカード文字 と 呼ばれます。引用符なしの引数が 1 つまたは複数のグロブ文字を含む場合、シェルは引数 をファイル名生成用に処理します。グロブ文字は、グロブ・パターン の一部であり、ファイルおよびディレクトリー名を表すものです。これらのパターンは、正規表現に似ていますが、構文は異なります。パターンは、ファイル名およびワード (任意のストリングではなく) と一致するように 意図されているからです。グロブ・パターンに現れることがある特殊な構造は以下のとおりです。
?
ファイル名の 1 文字と正確に一致します (ただし、ファイル名の先頭にある区切り文字 /. は除きます)。? は実際のファイル名の文字にのみ一致させ、ファイル名の終わりの 存在しない文字とは一致させません。? は、正規表現のメタキャラクター . に似ています。
*
ファイル名の中のゼロ個以上の文字と一致しますが、? と 同じ制限に従います。* は、正規表現の .* に似ています。
[chars]
文字のクラス を定義します。グロブ・パターンはクラスの中の任意 の 1 文字と一致します。 クラスにはある範囲の文字を入れることができます。範囲の最初の文字、ダッシュ -、および最後の文字を書くことによって指定します。例えば、[A-Za-z] は、POSIX ロケールでは、大文字および小文字のすべてを表します。リテラル - 文字 (または他のグロブ文字) をクラスに入れ たい場合には、文字をエスケープするために円記号を使用 してください。それによって、パターン式の中でその特殊な意味をもたなく なります。 大括弧内の最初の文字が感嘆符 (!) の場合は、パターンは、クラスの中にない 文字ならば、どの 1 文字とも一致します。
以下にパターンの例を示します。
[!a-f]*.c
a から f までの文字以外の文字で始まる .c ファイルのすべてに一致します。
/???/?.?
3 文字の名前を持つディレクトリーのルート・ディレクトリーの下にあるすべてのファイル、および単一文字の後ろに . が続き、さらにその後ろ に別の単一文字を含んでいるようなベース名を持つすべてのファイルを一致させます。
*/*.[chyl]
作業ディレクトリーのサブディレクトリーの中 の .c.h.y および .l ファイルすべてと一致します。
~mks/*.ksh
ユーザー mks のホーム・ディレクトリーの中のすべての シェル・スクリプトと一致します。
(~ の使用については、ディレクトリー置換を参照してください)。

パターンに一致するファイルがない場合、sh は、引数をそのままに しておきます。set オプションの –f または “–o noglob” が有効であると、シェルはファイル名生成を実行しません。

ヒント: ファイル名の中に 2 バイト文字を使用すると、問題を起こす原因になります。 例えば、2 バイト文字を使用し、 そのバイトの 1 つが . (ドット) または / (スラッシュ) として使用すると、ファイル・システムはこれをパス名の一部として扱います。

変数

シェルは、変数を保持します。そして、変数がコマンド行で使用された場合、変数を 展開することができます。詳細は、パラメーター置換 を参照してください

変数名は、大文字または小文字または下線文字 (_) で始まる必要 があります。名前の後続の文字には、もしあれば、大文字または小文字、下線文字、または 0 から 9 までの数字を使用することができます。以下の方法で数値に値を割り当てることができます。
variable=value
整変数 (詳細は、オプションを参照) の場合、演算式で値を指定できます。算術式の構文については、算術置換を参照してください。
値を割り当てる際に以下のように添え字式を使用することによって、変数を配列 として暗黙に宣言することができます。
variable[arithmetic expression]=value

添え字付き配列変数は、シェルが通常変数を許容しているところにはどこでも 使用することができます。算術式の構文については、算術置換を参照してください。シェル変数の属性の詳細、およびシェル変数を子プロセスにエクスポートする 方法については、typesetexport、および readonly も参照してください。

シェルが設定するか認識する変数のリストは、シェル変数を参照してください。

シェル変数

2 バイト文字をシェル変数名に使用することはできませんが、シェル変数の値に使用することはできます。ファイル名およびパス名の中の 2 バイト文字は、単一バイト文字として扱われます。

エクスポートされたシェル変数は、環境変数 と呼ばれ、シェルから 実行されるすべてのコマンドの環境で使用できるようになります。表 1 は組み込みシェル変数のリストであり、頻繁に使用される環境変数が含まれています。C-RTL によって 使用される環境変数についての詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。 他の環境変数のリスト は、z/OS UNIX System Services 計画にあります。表 1 は、頻繁に使用されるシェル変数とその目的をリストしています。

表 1. 組み込みシェル変数 (sh コマンド)
変数 目的
_ (下線) シェルの子として実行されるすべてのコマンドに対して 、sh は、この変数を実行可能ファイルの絶対パス名に設定し、この値を 環境を通じてその子プロセスに渡します。MAILPATH 変数を処理する際、この変数は対応するメール・ファイルの値を保持します。
~ (波形記号) は、ホーム・ディレクトリーの値に展開します。
_UNIX03 _UNIX03 が YES に設定されている場合、UNIX03 仕様のサポートがインプリメントされているユーティリティーは UNIX03 仕様に準拠します。この変数は、UNIX03 の構文または動作が既存のインプリメンテーションと競合する場合にのみ必要です。

値 YES は大文字で指定する必要があります。

CDPATH cd コマンドが検索するためのディレクトリーのリストが入っています。ディレクトリー名はコロンで区切られています。CDPATH は、PATH 変数のように働きます。
COLUMNS 端末出力デバイスの幅を定義するためにいくつかのコマンドに 使用されます。
EDITOR 対応する編集モード (set および shedit 参照) を、viemacs、または gmacs を使用するとき、使用可能にします。
ENV

コマンドおよび別名が入っているセットアップ・スクリプトのパス名が入っています。

sh をログイン・シェルとして呼び出すと、ENV スクリプトはログイン・プロファイル (/etc/profile$HOME/.profile) の後に実行され、その後、シェルがコマンドを受け入れます。それ以外の sh の呼び出しでは、ENV スクリプトはシェルがコマンドを受け入れる前に実行されます。これは、シェルのオプション、関数、および別名を定義するためによく使用されます。

sh はこの値についてパラメーター置換を実行し、結果をセットアップ・スクリプトの名前として使用します。このスクリプトは、現行のシェル環境で実行されます。ENV 変数は通常、ユーザーの .profile 内に設定されます。

ERRNO 最後に失敗したシステム・コールのシステム・エラー番号が入ります。シェルがこの変数を設定するのは、現行の環境内で起きたエラーに対してのみです。値 0 をこの変数に割り当てると、変数をクリアします。
FCEDIT fc コマンド用のデフォルトのエディターの名前が入っています。この変数が設定されていない場合、デフォルトは ed コマンドです。
FPATH 実行可能関数を見つけるためにシステムが検索するディレクトリーのリスト が入っています。このリストのディレクトリーは、コロンで区切られています。sh は、一致する関数が見つかるまで 、リスト内に指定された順に各ディレクトリーを検索します。シェルに作業ディレクトリーを検索させる場合は、ドット (.)またはヌル・ストリングをディレクトリーのリスト に入れます (例えば、最初に作業ディレクトリーを検索するようにシェル に指示するには、リストをコロンまたはセミコロンで始めます)。
HISTFILE ヒストリー・ファイルとして使用するファイルのパス名が入ります。シェルが開始すると、この変数の値がデフォルトのヒストリー・ファイルを変更します。
HISTSIZE シェルがヒストリー・ファイルに保持するコマンドの最大数が入っています。シェル開始時に、この変数に有効な数が入っていると、デフォルトの 127 を変更します。
HOME ホーム・ディレクトリーを含みます。これは、cd コマンドのデフォルト・ディレクトリーにもなります。HOME 変数は、 ユーザーがログインするときに RACF ユーザー・プロファイルから 自動的に設定されます。
IFS 内部フィールド分離文字 として使用する 一連の文字を含みます。これらの文字のいずれも、`command` また は $(command) などの引用符なしコマンド置換、あるいはパラメ ーター置換において、引数を区切ることができます。さらに、シェルはこれらの文字を、read コマンドで変数に入れる 値を区切るために使用します。最終的に、IFS の値の最初の文字が $* 拡張の中の 定位置パラメーターを区切ります。デフォルトで、IFS にはスペース、タブ、および改行が入ります。
LANG デフォルトのロケール値が入ります。
LIBPATH DLL (ダイナミック・リンク・ライブラリー) ファイル名を検索するための ディレクトリーを指定するために使用されます。設定されていない場合は、作業ディレクトリーが検索されます。詳細は、「z/OS XL C/C++ ランタイム・ライブラリー・リファレンス」の dlload を参照してください。

LIBPATH は、_CEE_ENVFILE または _CEE_ENVFILE_S 環境変数で更新できます。 _CEE_ENVFILE の詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。

LINENO シェル・スクリプトまたは関数で現在実行中の行番号が入ります。
LINES 端末出力デバイスの行数を定義するためにいくつかのコマンドに 使用されます。
LOCPATH setlocale() 関数に、ロケール・オブジェクト・ファイルのロード元となる z/OS UNIX ファイル・システムのディレクトリーの名前を指示します。(localedef は、ロケール・ソース・ファイルを処理して ロケール・オブジェクト・ファイルを作成します。)
LOGNAME ユーザー・ログイン名が入ります。これは、ユーザーがログインすると 、RACF ユーザー・プロファイルから自動的に設定されます。
MAILCHECK システムがメールをチェックするまでに経過する必要がある経過時間の秒 数が入ります。デフォルト値は 600 秒です。MAIL または MAILPATH 変数 を使用すると、シェルは、プロンプトを出す前にメールをチェックします。
MAILPATH メールボックス・ファイルのリストが入ります。これは、MAIL 変数を変更し ます。メールボックス・リストはコロンで区切られます。いずれかの名前の後ろ に ?message または %message がある場合は、sh は、対応する ファイルが変更されるとメッセージを表示します。sh は 、message においてパラメーターとコマンドの置換を行い、変数 _ を (一時的に) メールボックス・ファイルの名前に展開します。?message% message も ない場合は、デフォルトのメッセージは you have mail in $_. です。
MANPATH マニュアル・ページで検索するパスのリストを含みます。
MBOX 個人用メールボックスのパス名、通常、$HOME/mbox が入り、システム・メールボックスから読み取った メッセージを保管するのに使用されます。この変数は 通常、ユーザーの .profile 内に設定されます。
NLSPATH メッセージ・カタログが検出される場所を指定します。
OLDPWD 直前に作業していたディレクトリーの名前が入ります。cd コマンドがこの変数を設定します。
PATH 実行可能コマンドを検出するためにシステムが検索するディレクトリーの リストが入っています。このリストのディレクトリーは、コロンで区切られています。sh は、実行可能コマンドが見つかるまで、それぞれのディレクトリーを リストに指定された順序で検索します。シェルに作業ディレクトリーを検索させる場合は、ドット (.)またはヌル・ストリングをディレクトリーのリスト に入れます (例えば、最初に作業ディレクトリーを検索するようにシェル に指示するには、リストをコロンまたはセミコロンで始めます)。

シェル・コマンド・ディレクトリー /bin は、常にディレクトリーのリストに含まれている必要があります。PATH 変数の指定に関する詳細は、「z/OS V2R2.0 UNIX System Services ユーザーズ・ガイド」で、コマンドの検索パスをカスタマイズする際の PATH 変数の使用に関するトピックを参照してください。

PPID シェルの親のプロセス ID の 10 進値が入ります。子シェル環境で実行している場合 (シェル実行環境を参照)、PPID 値は現在のシェルの PPID 値を同じになります。
PS1 シェルが対話式のときに使用する 1 次プロンプト・ストリングが入ります。 デフォルト値は、ドル記号の後にスペース ($  ) です。シェルは、パラメーターを プロンプトが印刷される前に展開します。プロンプト・ストリング内の単一の感嘆符 (!) は、 ヒストリー・リストからのコマンド番号によって置き換えられます。fc コマンドを参照してください。プロンプトの 中で実際に感嘆符が必要な場合は、!! を使用してください。この変数は 通常、ユーザーの .profile 内に設定されます。
PS2 予約語コマンド、引用符付きストリング、および here ドキュメントなどの入力を 完了する際に使用される 2 次プロンプト、すなわち継続プロンプトが入り ます。この変数のデフォルト値は、スペースを後ろに付けた、より大きい記号 ( ) です。
PS3 select 予約語と一緒に使用されるプロンプト・ストリングが 含まれます。デフォルト値は、番号記号の後ろに疑問符とスペース (#? ) が付い たものです。
PS4 set -x を伴うトレースされるコマンドの接頭部が入ります。デフ ォルト値は、正符号の後にスペース (+ ) です。
PWD 作業ディレクトリーの名前が入ります。シェルが開始すると、変数がすでに値を持っていない限り、作業ディレクトリー名が PWD に割り当てられます。
RANDOM ランダム整数を戻します。この変数を設定すると、乱数生成プログラムに新しい seed (シード) が設定されます。
SECONDS 経過時間が入ります。この変数の値は、リアルタイムの 1 秒経過ごとに 1 増えます。この変数に任意の値が割り当てられると、SECONDS カウンターがその値に設定されます。シェルは初期値と して 0 を設定します。
SHELL 現行シェルの絶対パス名が入っています。シェルが設定するのではありませんが、他のさまざまなコマンドがシェルを 起動するために使用します。これは、ユーザーがログインすると 、RACF ユーザー・プロファイルから自動的に設定されます。
STEPLIB 実行可能ファイルを実行するための処理イメージの作成に 使用する STEPLIB 変数を識別します。STEPLIB は、専用ライブラリーの集合で、ランタイム・ライブラリーの新規バージ ョンなどのようなアプリケーション・プログラムの新規またはテスト・バー ジョンを格納するのに使用されます。STEPLIB は 、CURRENT または NONE という値、または MVS™ データ・セット名のリストに設定することができます。

STEPLIB が設定されていない場合、デフォルトは CURRENT で、起動者の MVS プログラム検索順序環境の部分である TASKLIB、STEPLIB、または JOBLIB 割り当てを、実行可能ファイル用に作成された処理イメージに渡します。

IBM® では、STEPLIB は値 NONE に設定することをお勧めします。この指定は、ユーザーが実行可能ファイル用の STEPLIB 環境を必要としない ことを示します。MVS データ・セット名は、コロンで区切って 255 まで、STEPLIB 変数を 作成するのに使用されるデータ・セットのリストとして指定できます。 STEPLIB 環境の組み立てについて は、「z/OS UNIX System Services 計画 」を参照してください。

TMOUT ユーザー入力がタイムアウトになるまでの秒数が入っています。ユーザー入力をこの時間内に 受け取らないと、シェルは終了します。

_BPXK_TIMEOUT 環境変数を使用すると、ジョブのタイムアウト値 を個々のプロセス・ベースでオーバーライドすることができます。

システム管理者は、BPXPRMxx PWT オプションを使用して、SMF ジョブ待ち時間の値を受け入れ、 _BPXK_TIMEOUT 変数の指定を許可することができます。これらの設定を TMOUT の代わりに使用して、シェルのタイムアウトを制御することができます。PWT および _BPXK_TIMEOUT オプションは、シェルで実行されているコマンド (vioedit など) のタイムアウトも設定します。 このため、タイムアウト・プロセスをより細かく制御することができます。TMOUT 変数が BPXPRMxx PWT オプションまたは _BPXK_TIMEOUT 変数 (またはその両方) と一緒に設定されている場合、TMOUT 値が SMF ジョブ待ち時間より小さければ、TMOUT 値がシェルのタイムアウト値として使用されます。

TMPDIR 一時ファイルに使用されるディレクトリーのパス名です。設定されなかった場合、z/OS シェル/tmp を使用します。
TZ 日付と時刻を表示するためのシステム時間帯の値が入っています。TZ 変数は、シェル始動時に使用される $HOME/.profile ファイルに設定できます。

システム管理者はまた、TZ のデフォルトを /etc/profile ファイルのすべての シェル・ユーザーに定義できます。同じ時間帯でない場合は、TZ を 自分で設定できます。

さらに、システム管理者は、/etc/init プロセス のための TZ を /etc/init.options ファイルに 定義することができます。

VISUAL EDITOR 環境変数を viemacs、または gmacs 編集モードの設定で上書きします (shedit を参照)。

自動変換用のシェル変数

シェルが stdin、stdout、または stderr をリダイレクトしている場合、シェルはタグ付けされたファイルのデフォルトを非自動変換に、およびリダイレクトで作成された ファイルのデフォルトを非タグ付けにします。以下のシェル変数はこの動作をオーバーライドします。
表 2. 自動変換用のシェル変数 (sh コマンド)
変数 目的
_TAG_REDIR_IN=TXT リダイレクトされた stdin は、それがあたかも以下のようにタグ付けされているかのように扱われて、そのファイルのテキスト・フラグ (TXTFLAG) をオーバーライドします。

TXTFLAG = ON、CCSID = 既存のファイル・タグ CCSID

CCSID = 0 の場合、効果はありません。

.
_TAG_REDIR_IN=BIN リダイレクトされた stdin では、そのファイルのテキスト・フラグ (TXTFLAG) は以下のようにタグ付けされているものとして、オーバーライドされます。

TXTFLAG = OFF、CCSID = 既存のファイル・タグ CCSID

これにより、自動変換が使用不可となります。

_TAG_REDIR_OUT=TXT リダイレクトされた stdout は以下のようにタグ付けされます。

TXTFLAG = ON、CCSID = 最初の書き込み時点の プログラム CCSID (まだタグ付けされていない場合)

_TAG_REDIR_OUT=BIN リダイレクトされた stdout は以下のようにタグ付けされます。

TXTFLAG = OFF、CCSID = 最初の書き込み時点の プログラム CCSID (まだタグ付けされていない場合)

_TAG_REDIR_ERR=TXT リダイレクトされた stderr は以下のようにタグ付けされます。

TXTFLAG = ON、CCSID = 最初の書き込み時点の プログラム CCSID (まだタグ付けされていない場合)

_TAG_REDIR_ERR=BIN リダイレクトされた stderr は以下のようにタグ付けされます。

TXTFLAG = OFF、CCSID = 最初の書き込み時点の プログラム CCSID (まだタグ付けされていない場合)

自動変換シェル変数は、1 コマンドに対して、またはシェル・セッションまたはシェル・スクリプト内の 複数コマンドに対して指定することができます。その変数をエクスポートすると、子シェル、すなわちネストされたシェル・スクリプトに 影響します。

注: 標準のシェルの実行では変数割り当て前にリダイレクトが行われるために 、1 つのコマンドに対するシェル変数を指定するための構文は、以下のとおりです。
(_TAG_REDIR_OUT=TXT; command >file)

これらのシェル変数は、パイプライン・コマンドでも使用できます。例えば、これらの変数を使用して、パイプラインに書き出す各コマンドの標準出力またはパイプラインから読み込む各コマンドの標準入力にタグ付けすることができます。

また、_TAG_REDIR_IN シェル変数を here ドキュメントと併用して、関連コマンドに送られる入力データにタグ付けできます。

シェル実行環境

シェル実行環境 とは、シェル内で動作するコマンドのほとんどに影響を与える条件の集合のことです。 シェル実行環境は以下で構成されます。
  • オープン・ファイル。
  • 作業ディレクトリー (cd 参照)。
  • ファイル作成マスク (umask 参照)。
  • 現在設定されているトラップ (trap 参照)。
  • シェル・パラメーター (set および export 参照)。
  • 現在定義されているシェル関数 (コマンド実行 を参照)
  • オプション (set 参照)。

子シェル環境は、シェル環境の複写として始まります。ただし、シェルが捕えるトラップが子シェルではデフォルト値に設定されることは除きます。 子シェル環境は重複として開始するため、ENV 環境変数の値は 実行されません。子シェル環境になされた変更は、シェル環境には影響しません。

コマンド置換 (例えば、$command)、括弧内のコマンド (例えば、(command))、および 非同期に実行されるコマンド (例えば、command&) はすべて 子シェル環境で実行されます。パイプライン内のそれぞれのコマンド (例えば、“command | command”) も、pipecurrent シェル・オプションが 有効になっていない限り、子シェル環境で実行されます。pipecurrent がオンに 設定されている (set -o pipecurrent または set -P を使用) 場合、パイプラインの最後のコマンドが現行シェル環境で実行されます。

シェル・コマンドはまた、明示的にシェル環境を代替する特定の組み込み コマンド (例えば、cd および umask) を除く シェル環境に影響しない別の環境でも実行されます。シェル・コマンドの環境は、以下を含むようにシェルが設定します。
  • オープン・ファイル、リダイレクトによって変わる。
  • 作業ディレクトリー (cd 参照)。
  • ファイル作成マスク (umask 参照)。
  • トラップ。シェルに捕えられるトラップはデフォルト値に設定され、シェルに 無視されるトラップは、コマンドにも無視されます。
  • シェル内で定義され、export 属性を持つ変数。

組み込みコマンド

一部のコマンドは、シェル・スクリプトのパフォーマンスを上げるため、またはシェルの内部データ構造および変数にアクセスするために、シェルに組み込まれます。これらの内部コマンドは、外部コマンドと見分けがつかない意味を持つようにつくられています。

POSIX.2 は、これらのコマンドのサブセットを 特殊 組み込みとして認識します。 特殊組み込みコマンドの構文エラーは、シェルにそのコマンドの実行を終了させることがあります。通常組み込みコマンドの構文エラーは、シェルにそのコマンドの実行を終了させる原因にはなりません。構文エラーになった 特殊組み込みコマンドはシェルを終了することはなく、ゼロ以外の終了値になります。

また、特殊組み込みコマンドを呼び出すシェル・コマンド行に 組み込まれるシェル変数の割り当ては、組み込みコマンドが完了した 後も効果が残ります。これは、通常組み込みコマンドまたは その他のユーティリティーの場合と異なります。このような特殊組み込みコマンドは次のとおりです。
  • :
  • .
  • break
  • continue
  • eval
  • exec
  • exit
  • export
  • set
  • readonly
  • return
  • typeset
  • shift
  • trap
  • unset
組み込みコマンドと同様に、シェルには次のような事前定義の別名が一組あります。
  • autoload
  • hash
  • functions
  • integer
  • history
  • r
  • nohup
  • suspend
  • stop
詳細については、alias を参照してください。

シェル・アーカイブ

Usenet のようなコンピューター・ネットワークを通じて配布されるソフトウェアは、多くの場合、シェル・アーカイブ と呼ばれるフォーマットで配布されます。シェル・アーカイブとは、1 つまたは複数のファイルのデータを含むシェル・スクリ プト、およびデータ・ファイルを再構成し、データが正しく送られたことを 検査するためのコマンドからなるものです。以下にシェル・アーカイブの例を示します。
# This is a shell archive.
# It contains the one file "frag.ksh"
# To extract contents, type
# sh file
#
if      [ –f frag.ksh ]
then    echo frag.ksh exists: will not overwrite
else
    echo extracting frag.ksh
    sed 's/^X//' >frag.ksh <<_EOF_
X# This is frag.ksh
X# Not very interesting, really.
Xecho frag.ksh here!
_EOF_
    if [ "`sum frag.ksh|awk '{print $1{'`" != 52575 ]
    then        echo frag.ksh damaged in transit
    fi
fi
次に示すのは、整数で計算できるフィボナッチ数列をできるだけ多く生成する単純なスクリプトです。
# Print out Fibonacci sequence; start sequence
# with first two positional parameters:
# default 1 1
typeset –i x=${1:–1{ y=${2:–1} z
while   [ x –gt 0 ]     # until overflow
do
        echo $x
        let z=y+x x=y y=z
done
以下は basename コマンドをシェル関数として実装するもの です。
# basename command as shell function
function basename {
        case $# in
        1)      ;;
        2)      eval set ¥${1%$2} ;;
        *)      echo Usage:       $0 pathname '[suffix]     '
                return 1 ;;
        esac
        echo ${1##*/}
        return 0
}

ファイル

sh_history
デフォルト・ヒストリー・ストレージ・ファイル。
.profile
ログイン・シェルのユーザー・プロファイル。
/etc/profile
ログイン・シェルのシステム全体に渡るプロファイル。
/tmp/sh*
here ドキュメント、コマンド置換、およびヒストリー再実行などのための一時ファイル。デフォルト・ディレクトリー /tmp は、シェル変数 TMPDIR を 他のディレクトリーの名前に設定することにより、変更することができます。
/etc/suid_profile
ENV 変数 (およびログイン・シェルの $HOME/.profile) で指定されたスクリプトの代わりに、特権オプションの下で、または実際と実効の UID が異なるときや、実際と実効の GID が異なるときに使用されます。

ローカライズ

sh は、以下のローカライズ環境変数を使用します。
  • LANG
  • LC_ALL
  • LC_COLLATE
  • LC_CTYPE
  • LC_MESSAGES
  • LC_SYNTAX

詳しくは、ローカライズを参照してください。

終了値

0
正常終了
1
以下のいずれかによる失敗。
  • シェルが誤っているオプションで起動された
  • シェルがシェル・スクリプトおよびコマンドを実行するために起動された
  • コマンド構文エラー
  • リダイレクト・エラー
  • 変数拡張エラー

これ以外の場合、シェルの終了状況は、デフォルトではシェルが実行した最 後のコマンドの終了状況になります。このデフォルトは、exit または return コマンドを明示的に使用する ことにより、変更することができます。パイプラインの終了状況は、パイプライン内の最後のコマンドの終了状況です。

メッセージ

Ambiguous redirection
リダイレクト構成が複数のパス名に展開されました。
Argument too long
コマンドに対する単一の引数にはすべて長さに制限があります (制限 を参照)。コマンドおよびパラメーター置換ではこの制限を超える場合があります。
Cannot restore privileged state
このメッセージが出るのは、インストールした POSIX が saved IDs オプション (_POSIX_SAVED_IDS) をサポートしていない場合だけです。 特権状態に戻るために saved ID 機 能を使用しようとした場合にメッセージが生成されます。
File file already exists
出力を既存ファイルにリダイレクトしようとしています が、noclobber オプションがオンにしてあります (set コマンドを参照)。本当に出力を既存ファイルにリダイレクトしたい場合は、構成 >|filename を使用するか、または下記によりオプションをオフにしてください。
set +o noclobber
File descriptor number already redirected
同じコマンドの中ですでにリダイレクトされつつあるファイル記述子をリダイレクト しようとしました。ファイル記述子をリダイレクトできるのは一度だけです。
切断
シェルが hangup シグナルを受信しました。このシグナルは、一般に、通信回線の切断、例えば、電話回線の接続が切れた場合に発生します。
In base#number: base must be in [2,36]
形式 base#number の数において、base が 36 より大きいか、または 2 より小さい値でした。有効範囲は 2 から 36 までです。
Invalid subscript
シェル配列が、定義境界外の添え字でインデックスされていました。
Illegal instruction
シェルは正しくない命令シグナルを受信しました。一般にこのシグナルは、プロセスがハードウェアによって認識される有効なマシン・インストラクシ ョン以外の何かを実行しようとした場合に発生します。
Misplaced subscript array name
配列の添え字に欠落または誤りがあります。
name is not an identifier
非英数字の name を使用しようとしました。
name: readonly variable
与えられた name は読み取り専用の変数で、除去または変更はできません (readonly を参照)。
name: no expansion of unset variable
シェルが set –u で動いており、unset 変数を置換で 使用しました。詳細は、set コマンドを参照してください。
No file descriptor available for redirection
ファイル記述子がリダイレクトされると、古い値はさらに別のファイル記述子に複写することによりシェルに記憶されます。ファイル記述子の合計数はシステムによって 制限されています。そのため、ユーザーのコマンドが記述子の最大数よりはるかに少ない数しか使用していないように見えても、シェルが不足する場合があります。
Nested aliases
9 を超える別名のレベルがあります。例えば、以下のとおりです。
alias a1=a2 a2=a3 a3=a4 … a10=command
は、このエラーを起こします。
Pipe for coprocess
シェルは共用プロセスのパイプを作成できません。これは、ユーザーのセッションまたは システム全体がパイプの最大数をすでに設定してしまっていることを意味している場合があります。
…: restricted
シェルが限定シェルとして起動されると、一定の事柄、例えば、cd コマンド、PATH の設定、出力のリダイレクト などが不許可になります。
Temporary file error using here-document
sh が、<<word here ドキュメントの 内容を持つ一時ファイルを作成しようとしました。しかし、一時ファイルは作成できませんでした。これは、一時ファイルが作成されるディスクの スペース不足を示している場合があります。
Word after … expanded to more than one argument
引数が 1 つだけ期待されているコンテキストにおいて、構成が複数の引数に 展開されました。

制限

サブディレクトリーと拡張子を含む実行可能ファイル名の最大長は、1023 バ イトです。

移植性

POSIX.2, X/Open 移植性ガイドX/Open 移植性ガイド.

構成 $[arithmetic expression] は、 POSIX 標準の拡張です。

関連情報

aliasbreakcdcontinuedotechoevalexecexitexportfcgetoptsletprintpspwdreadreadonlyreturnsetshifttesttimetraptruetypesetulimitunaliasunsetwhenceshedit

TZ 環境変数のフォーマットに、TZ 環境変数を使用してローカル・タイム・ゾーンを設定する方法が説明されています。