前へ | 次へ | 目次 | 索引 |
コマンド・プロシージャ,またはサブルーチンの処理を終了し,呼び出したコマンド・レベル(コマンド・プロシージャまたは会話型DCL)に制御を戻します。また,ユーザが Ctrl/Y を入力した後,イメージを正常終了させます。
EXIT [状態コード]
状態コード
すでに用意されているグローバル・シンボル $STATUS に与える数値を定義します。状態コードには整数,または整数値が求められる式を指定できます。この値は,外側のコマンド・レベルからテストできます。ロングワード整数値の下位 3 ビットは,予約されているグローバル・シンボル $SEVERITY の値を変更します。状態コードを指定する場合,DCL はコンディション・コードとして解釈します。値が偶数の場合には,警告メッセージ,エラー・メッセージおよび重大なエラー・メッセージが作成されます。値が奇数の場合には,正常終了メッセージまたは情報メッセージが作成されます。
状態コードを指定しない場合には,$STATUS の現在の値が保存されます。制御が外側のコマンド・レベルに渡される場合には, $STATUS には最後に実行されたコマンドまたはプログラムの状態が設定されます。
EXIT および STOP コマンドは,ともにプロシージャの実行を終了させる方法を提供します。 EXIT コマンドは,現在のコマンド・プロシージャの実行を終了させ,呼び出し側のコマンド・レベルに制御を戻します。 EXIT コマンドをコマンド・レベル 0 で非会話型プロセス (バッチ・ジョブなど) から入力すると,プロセスは終了します。STOP コマンドは,現在のコマンド・レベルにかかわらず,制御をコマンド・レベル0に戻します。 STOP コマンドをコマンド・プロシージャまたは非会話型プロセス (バッチ・ジョブなど) から実行すると,プロセスは終了します。
DCL コマンド,ユーザ・プログラム,またはコマンド・プロシージャが終了する場合と,コマンド・インタプリタは条件コード値をグローバル・シンボル $STATUS に保存します。 EXIT コマンドで明示的に $STATUS の値を設定しないと,コマンド・インタプリタは $STATUS の現在の値を使用してエラー状態を決定します。
$STATUS に含まれる状態値の下位3ビットが,条件の重大度を表します。予約されているグローバル・シンボル $SEVERITY には,条件コードのこの部分が入ります。重大度の値の範囲は,次のように0 〜 4 です。
値 重大度 0 警告 1 正常終了 2 エラー 3 情報 4 重大な(致命的な)エラー
正常終了および情報のコードは奇数の値,警告およびエラーのコードは偶数の値であることに注意してください。
コマンド・プロシージャが終了し,制御が別のレベルに戻る場合には,コマンド・インタプリタが $STATUS の現在の値をテストします。 $STATUS の値が偶数で,その高位ビットが 0 の場合は,コマンド・インタプリタは, (存在する場合は) その状態コードに対応するシステム・メッセージを表示します。メッセージが存在しない場合は,NOMSG メッセージが表示されます。高位ビットが1の場合,メッセージは表示されません。
DCL コマンドですでに表示された警告またはエラー状態の後でコマンド・プロシージャが終了すると,コマンド・インタプリタは,$STATUS の高位ビットを1にセットします。残りのビットは変更されません。これによって,エラーの原因になったコマンドも,コマンド・プロシージャも,エラー・メッセージを表示しなくなります。
Ctrl/Y でイメージを中断してから EXIT コマンドを使用すると,現在実行中のイメージが正常終了します。イメージに終了処理ルーチンが宣言されていた場合,終了処理ルーチンに制御が移ります。これに対し,STOP コマンドは,終了処理ルーチンを実行しません。このため,通常は STOP コマンドではなく EXIT コマンドを使用してください。
#1 |
---|
$ EXIT 1 |
$STATUS と $SERVERITY に 1 を設定して,1つ外側のプロシージャ・レベルに抜けます。
#2 |
---|
$ ON WARNING THEN EXIT $ FORTRAN 'P1' $ LINK 'P1' $ RUN 'P1' |
EXIT コマンドは,ON コマンドの条件成立時のコマンドとして使用されています。このステートメントは,警告またはエラーがプロシージャ内のコマンドから出されたときに,コマンド・プロシージャが必ず終了するようにします。
プロシージャは終了する前に,終了する原因となったコマンドまたはプログラムの状態コードを設定します。
#3 |
---|
$ START: $ IF (P1 .EQS. "TAPE") .OR. (P1 .EQS. "DISK") THEN GOTO 'P1' $ INQUIRE P1 "Enter device (TAPE or DISK)" $ GOTO START $ TAPE: ! Process tape files . . . $ EXIT $ DISK: ! Process disk files . . . $ EXIT |
この例では,コマンド・プロシージャ内で,異なったコマンド・パスを終了させる方法を示しています。このコマンド・プロシージャの実行時には,パラメータに TAPE または DISK を指定します。 IF コマンドは論理 OR を使用して,これらの文字列が入力されたかテストします。結果が真であれば GO TO コマンドは対応するラベルに分岐します。 P1 がTAPE でも DISK でもない場合は,正しいパラメータを入力するよう INQUIRE コマンドが要求します。
ラベル TAPE および DISK に続くコマンドは,パスが異なっています。ラベル DISK の前の EXIT コマンドは,プロシージャが明示的に DISK に分岐した時のみ,ラベル DISK 以降のコマンドが実行されることを保証しています。
プロシージャの終わりでは,自動適に EXIT コマンドが実行されるので,最後の EXIT コマンドは必要ありません。しかし,このように明示的に使用することをおすすめします。
#4 |
---|
$ IF P1. EQS. "" THEN - INQUIRE P1 "Enter filespec (null to exit)" $ IF P1 .EQS. "" THEN EXIT $ PRINT 'P1'/AFTER=20:00/COPIES=50/FORMS=6 |
このコマンド・プロシージャは,パラメータがそのプロシージャに渡されたかどうかをテストします。パラメータが渡されていない場合には,プロシージャは必要なパラメータを要求するプロンプトを表示します。そのあと,パラメータ P1 を再びテストします。データを含まない行を指定するために,キャリッジ・リターンを入力し,パラメータとして空文字列が与えられた場合には,プロシージャは終了します。それ以外の場合には,入力パラメータとして P1 の現在の値を使用して, PRINT コマンドを実行します。
#5 |
---|
$ IF P1 .EQS. "" THEN INQUIRE P1 "Code" $ CODE = %X'P1' $ EXIT CODE |
この例は,システム・ステータス・コードからシステム・メッセージを得る 1 つの方法を示しています。パラメータが 1つ必要で,入力しないと入力するよう要求します。基数演算子 %X を付けてシンボル CODE に代入しています。そして,EXIT コマンドを実行します。たとえば次のように使用します。
$ @E 1C %SYSTEM-F-EXQUOTA, exceeded quota
プロシージャ終了時には,$STATUS には %X1C が代入され,この値は EXQUOTA メッセージに評価されます。または,レキシカル関数 F$MESSAGE を使用しても同様のことができます。
#6 |
---|
$ RUN MYPROG [Ctrl/Y] $ EXIT |
この RUN コマンドは,MYPROG.EXE というイメージの実行を開始します。そのあと,CTRL/Y を使用して実行に割り込みがかけられています。 EXIT コマンドは MYPROG.EXE を終了する前に,イメージによって宣言された終了ハンドラ・ルーチンを呼び出します。
Alpha システムの場合は, ASCII ビットマップ分散フォーマット(BDF)をバイナリ・ポータブル・コンパイル・フォーマット(PCF) に変換します。また VAX システムの場合は,ASCII ビットマップ分散フォーマット(BDF)をバイナリ・サーバ・ナチュラル・フォーマット(SNF) に変換します。 DECwindows サーバは,PCF または SNF ファイルを使用してフォントを表示します。 BDF ファイルをバイナリ・フォームに変換する際に,フォント・コンパイラは,フォントとコンパイル・プロセスに関する統計情報を提供します。フォント・コンパイラについての詳細は, OpenVMS DECwindows のプログラミングに関するマニュアルまたはオンライン・ヘルプを参照してください。
FONT ファイル指定
コマンド・プロシージャ・レベルを変更せずに,制御をコマンド・プロシージャ内のラベルが付けられたサブルーチンに渡します。
GOSUB ラベル
ラベル
コマンド行の最初の項目として, 1文字から 255 文字までの英数字のラベルを指定します。ラベルの中にブランクを含むことはできません。 GOSUB コマンドの実行後,制御は指定されたラベルのあとのコマンドに渡されます。ラベルは,現在のコマンド・プロシージャの中で, GOSUB ステートメントの前でもあとでもかまいません。コマンド・プロシージャ内でラベルを使用する場合には,最後にコロンを指定しなければなりません。ラベルが重複している場合,最も最近読まれたラベルへ飛びます。
ラベルで指定されたサブルーチンへ制御を移すには,コマンド・プロシージャで GOSUB コマンドを使用します。コマンド・ストリームをランダム・アクセス装置 (つまりディスク装置) から読み取っていないと,GOSUB コマンドは動作しません。RETURN コマンドは,GOSUB サブルーチン・プロシージャを終了させ, GOSUB 文の呼び出しの次のコマンドへ制御を移します。 RETURN コマンドは,省略可能な状態値を受け付けます。
GOSUB コマンドでは,新しいプロシージャ・レベルは生成されません。したがって,これを "ローカルの" サブルーチン呼び出しと呼びます。現在のコマンド・プロシージャ・レベルで定義されたラベルとローカル・シンボルは, GOSUB コマンドで呼び出されたサブルーチンで使用できます。 GOSUB コマンドは,プロシージャ・レベル当り,最高16レベルまでネストできます。
コマンド・インタプリタは,ラベルを検出すると,ラベル・テーブルにラベルを入れます。このテーブルは,ローカル・シンボル・テーブルで使用できる領域から割り当てられます。コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると,既存の定義が新しい定義で置き換えられます。したがって,重複ラベルを使用すると,制御は常に DCL が最後に読み取ったラベルに移ります。次の規則が適用されます。
- GOSUB コマンドの前と後に重複ラベルがある場合,制御はコマンドの前にあるラベルに移ります。
- すべての重複ラベルが GOSUB コマンドより前にある場合,制御は,最新のラベル,つまり GOSUB コマンドに最も近いラベルに移ります。
- すべての重複ラベルが GOSUB コマンドより後にある場合,制御は,GOSUB コマンドに最も近いラベルに移ります。
現在のコマンド・プロシージャにラベルが存在しない場合,プロシージャは続行できないため,強制終了します。
ラベルに使用できる領域のサイズには,制限があることに注意してください。コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合,コマンド・インタプリタのテーブル領域が不足し,エラー・メッセージが出ることがあります。
#1 |
---|
$! $! GOSUB.COM $! $ SHOW TIME $ GOSUB TEST1 $ WRITE SYS$OUTPUT "success completion" $ EXIT $! $! TEST1 GOSUB definition $! $ TEST1: $ WRITE SYS$OUTPUT "This is GOSUB level 1." $ GOSUB TEST2 $ RETURN %X1 $! $! TEST2 GOSUB definition $! $ TEST2: $ WRITE SYS$OUTPUT "This is GOSUB level 2." $ GOSUB TEST3 $ RETURN $! $! TEST3 GOSUB definition $! $ TEST3: $ WRITE SYS$OUTPUT "This is GOSUB level 3." $ RETURN |
このコマンド・プロシージャは,ラベルを付けられたサブルーチンへ制御を移すための GOSUB コマンドの使い方を示します。 GOSUB コマンドは TEST1にラベルを付けたサブルーチンに制御を移動します。プロシージャは,サブルーチン TEST1 でコマンドを実行し,サブルーチン TEST2 へ分岐します。その後,プロシージャは,サブルーチン TEST2 でコマンドを実行し,サブルーチン TEST3 へ分岐します。それぞれのサブルーチンは RETURN コマンドによって終了します。 TEST3 が実行された後,RETURN コマンドはそれぞれの呼出し GOSUB ステートメントに後続するコマンドラインへ制御を返します。この時点で,プロシージャはうまく実行されています。
制御をコマンド・プロシージャ内のラベルが付けられたステートメントに渡します。
GOTO ラベル
ラベル
コマンド行の最初の項目として, 1文字から 255 文字までの英数字のラベルを指定します。ラベルの中にブランクを含むことはできません。 GOTO コマンドの実行後,制御は指定されたラベルのあとのコマンドに渡されます。ラベルは,現在のコマンド・プロシージャの中で,GOTO ステートメントの前でもあとでもかまいません。コマンド・プロシージャ内でラベルを使用する場合には,最後にコロンを指定しなければなりません。ラベルが重複している場合,最も最近読まれたラベルへ飛びます。
プロシージャ内の次の行ではない行に制御を移すには,コマンド・プロシージャで GOTO コマンドを使用します。ラベルは,現在のコマンド・プロシージャの GOTO 文の前でも後でも使用できます。コマンド・ストリームがランダム・アクセス装置 (つまりディスク装置) から読み取られていない場合,GOTO コマンドは動作しません。GOTO コマンドのターゲット・ラベルが別の IF-THEN-ELSE 構造内にある場合は,エラー・メッセージ (DCL-W-USGOTO) が返されます。
コマンド・インタプリタは,ラベルを検出すると,ラベル・テーブルにラベルを入れます。このテーブルは,ローカル・シンボル・テーブルで使用できる領域から割り当てられます。コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると,既存の定義が新しい定義で置き換えられます。したがって,重複ラベルを使用すると,制御は常に DCL が最後に読み取ったラベルに移ります。次の規則が適用されます。
- GOTO コマンドの前と後に重複ラベルがある場合,制御はコマンドの前にあるラベルに移ります。
- すべての重複ラベルが GOTO コマンドより前にある場合,制御は,最新のラベル,つまり GOTO コマンドに最も近いラベルに移ります。
- すべての重複ラベルが GOTO コマンドより後にある場合,制御は,GOTO コマンドに最も近いラベルに移ります。
現在のコマンド・プロシージャにラベルが存在しない場合,プロシージャは続行できないので,強制終了します。
ラベルに使用できる領域のサイズには,制限があることに注意してください。コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合,コマンド・インタプリタのテーブル領域が不足し,エラー・メッセージが出ることがあります。
#1 |
---|
$ IF P1 .EQS. "HELP" THEN GOTO TELL $ IF P1 .EQS. "" THEN GOTO TELL . . . $ EXIT $ TELL: $ TYPE SYS$INPUT To use this procedure, you must enter a value for P1. . . . $ EXIT |
この例では, IF コマンドはプロシージャに渡された最初のパラメータを調べます。このパラメータが HELP という文字列の場合,あるいはパラメータが指定されていない場合には, GOTO コマンドが実行され,制御は TELL というラベルの行に移ります。それ以外の場合には,プロシージャは EXIT コマンドが検出されるまで実行を継続します。 TELL というラベルでは,TYPE コマンドがプロシージャの使用方法を示す入力ストリームのデータを表示します。
#2 |
---|
$ ON ERROR THEN GOTO CHECK . . . $ EXIT $ CHECK: ! Error handling routine . . . $ END: $ EXIT |
ON コマンドは,エラー処理ルーチンを設定します。そのあと,コマンド・プロシージャ内で実行されるコマンドあるいはプロシージャが,エラーまたは重大なエラーを報告した場合には,GOTO コマンドは,制御を CHECK というラベルに移します。
前へ | 次へ | 目次 | 索引 |