OpenVMS
ユーザーズ・マニュアル


前へ 次へ 目次 索引


13.6.6 ディスクおよびテープ・ボリュームでのコマンド・プロシージャの実行

これ以降の節では,ディスクおよびテープ・ボリューム上でコマンド・プロシージャを実行する方法を説明します。

13.6.6.1 個人用ディスクでの実行

SUBMIT コマンドを使用してコマンド・プロシージャをキューに登録する場合には,割り当てられているデバイス上のファイルにアクセスすることができません。しかし,/SHARE 修飾子を使用してマウントされている個人用ディスクに存在するコマンド・プロシージャは実行できます。

13.6.6.2 テープ・ボリューム上での実行

次の場合には,テープ・ボリュームに存在するコマンド・プロシージャを実行できます。

上記のいずれかの条件が満足される場合には,次の操作により,コマンド・プロシージャを実行できます。

手順 操作
1. コマンド・プロシージャを共用ディスク・ボリュームにコピーする。
2. コマンド・プロシージャを共用ディスク・ボリュームで実行する。

13.7 コマンド・プロシージャの終了と割り込み

この節で説明する方法を使用してコマンド・プロシージャを終了する場合には,コマンド・レベルについて理解しておかなければなりません。

コマンド・レベルとは,DCL レベル・インタプリタの入力ストリームです。ターミナルからコマンドを入力する場合には,コマンドはコマンド・レベル 0 で入力されます。単純な会話形式のコマンド・プロシージャ(CLEANUP.COM など)は,コマンド・レベル 1 で実行されます。プロシージャが終了し,DCL プロンプトが画面に再表示されると,コマンド・レベル 0 に戻ります。

13.7.1 終了方法

コマンド・プロシージャの実行中に,そのプロシージャを終了するには,次の 3 種類の方法を使用できます。

EXIT コマンドによる終了

コマンド・プロシージャは,プロシージャの終わりに到達するか,EXIT コマンドを検出すると終了します。いずれの場合も,次に高いコマンド・レベルに制御が戻ります。EXIT コマンドによって終了する場合,状態値を EXIT コマンドのパラメータとして指定すれば,その状態値を次に高いコマンド・レベルに戻すことができます。

たとえば,DCL コマンド・レベルで SUB を起動し,SUB が SUB1 を呼び出すと,次のようなアクションが生じます。

  1. SUB1 を終了すると,SUB1 を呼び出した後のコマンド行で SUB に戻る。

  2. SUB を終了すると,DCL コマンド・レベルに戻る。

STOP コマンドによる終了

STOP コマンドによって終了した場合には,STOP コマンドを実行するコマンド・レベルにかかわらず,制御はいつでも DCL コマンド・レベルに戻ります。

バッチ・ジョブの中で STOP コマンドを実行すると,バッチ・ジョブが終了します。

Ctrl/Y による終了

Ctrl/Y を押して,コマンド・プロシージャを中断させてから,EXIT コマンドまたは STOP コマンドを使用してプロシージャを終了することができます。この場合,EXITまたは STOP どちらのコマンドを使用した場合でもDCL レベルに戻ります。

次の例では,Ctrl/Y を押すことにより,TESTALL プロシージャに割り込みがかかります。EXIT コマンドはプロシージャの処理を終了し,DCL レベルに戻ります(プロシージャに割り込みをかけた後,STOP コマンドを入力することもできます)。


$ @TESTALL[Return]
[Ctrl/Y]
$ EXIT[Return]
$ 

13.7.2 終了処理ルーチン

コマンド・プロシージャを中断させる場合,コマンド(イメージ)が終了処理ルーチンを宣言するものであると,EXIT コマンドは終了処理ルーチンに制御を渡します。ただし,STOP コマンドはこれらのルーチンを実行しません。

13.8 エラー処理

省略時の設定では,コマンド・インタプリタは,コマンドを実行してエラーまたは重大エラーが生じると EXIT コマンドを実行します。このとき,プロシージャは終了して前のコマンド・レベルに戻ります。他の重大度(成功,警告,通知エラー)の場合には,コマンド・プロシージャの処理が継続されます。

コマンド・インタプリタは以上のようにしてエラー処理を行いますが,ユーザがコマンド・プロシージャの中のラベルを参照したときに,そのラベルが存在しない場合(たとえば,GOTO ERR1 コマンドをコマンド・プロシージャ内に指定したが,ERR1 がプロシージャ内でラベルとして使用されていない場合)には,警告メッセージを出してコマンド・プロシージャは終了します。

システムがエラー処理ルーチンの一部として EXIT コマンドを出した場合は,$STATUSの値は直前のコマンド・レベルに戻されます。このとき,コマンド・インタプリタは $STATUS の上位桁を 1 に設定するため,状態値に関連するメッセージを再表示しません。

たとえば,次のコマンド・プロシージャ TEST.COM には,出力ファイル指定にエラーがあります。


$ CREATE DUMMY.DAT\
THIS IS A TEST FILE 
$ SHOW TIME 

このプロシージャを実行すると,CREATE コマンドが $STATUS にエラーを戻し,対応するメッセージを表示します。このとき,コマンド・インタプリタは $STATUS の値を調べて,エラーが生じたかどうかを判別し,EXIT コマンドを出して $STATUS の値を戻します。CREATE コマンドはすでに 1 回メッセージを表示したため,プロシージャが終了してもエラー・メッセージは再表示されません。DCL コマンド・レベルでは,$STATUS にエラー・メッセージが保持されていますが,上位桁は 1 に設定されています。


$ @TEST 
%CREATE-E-OPENOUT, error opening DUMMY.DAT\ as output 
-RMS-F-SYN, file specification syntax error 
%DCL-W-SKPDAT, image data(records not beginning with "$")ignored 
$ SHOW SYMBOL $STATUS 
  $STATUS = "%X109110A2" 
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
  %CREATE-E-OPENOUT, error opening !AS as output 

13.8.1 省略時のエラー処理

次の表は,コマンド・プロシージャの実行中に,エラーが発生したり,Ctrl/Y による割り込みが発生したときに,実行される省略時の処理を示しています。これらの省略時の処理は,ON,SET [NO]ON,SET [NO]CONTROL=Y コマンドを使用して変更できます。

割り込み 省略時の処理
エラーまたは重大なエラー プロシージャを終了し,次のコマンド・レベルに戻る。
DCL コマンド・レベルまたはコマンド・レベル 1 での Ctrl/Y プロシージャに割り込みがかかる。他のイメージによって強制的に終了されない場合には,プロシージャを続行できる。
レベル 1 より下のコマンド・レベルでの Ctrl/Y プロシージャは終了し,次の上位コマンド・レベルに移動する。

13.9 エラー処理のその他の方法

これ以降の節では,その他のエラー処理方法を説明します。

13.9.1 ON コマンド

ON コマンドは,特定の重大度またはそれ以上の重大度のエラーが生じたときに実行されるアクションを指定します。このようなエラーが生じた場合には,システムは次のようなアクションをとります。

ON コマンドの処理は 1 回だけ実行されます。したがって,コマンド・プロシージャが ON コマンドに指定された処理を実行した後,省略時のエラー処理はリセットされます。

ON コマンドによって指定された処理は,コマンドが実行されているコマンド・レベルの内部だけで適用されます。したがって,別のプロシージャを起動するプロシージャの内部で ON コマンドを実行した場合には,ON コマンドの処理は,ネスティングしたプロシージャに適用されません。

ON コマンドの形式は次のとおりです。


ON condition THEN [$] command 

ただし,condition は次のいずれかのキーワードです。

ON キーワード アクション
WARNING コマンド・プロシージャは,警告,エラー,重大エラーが生じたときに指定されたアクションを実行する。
ERROR コマンド・プロシージャは,エラーまたは重大エラーが生じたときに指定されたアクションを実行し,警告エラーの場合には処理を継続する。
SEVERE_ERROR コマンド・プロシージャは,重大(回復不可能な)エラーが生じたときに指定されたアクションを実行し,警告またはエラーが生じた場合には処理を継続する。

特定の重大度レベルに対して ON コマンドの処理が設定された場合には,同じ重大度またはそれより重大度の高いエラーが発生したときに,コマンド・インタプリタは指定された処理を実行します。重大度の低いエラーが発生した場合には,コマンド・インタプリタはファイルの処理を続行します。

例: ON コマンドの使用

このコマンドを使用すれば,省略時のエラー処理を変更して,警告,エラー,または重大なエラーが発生したときに,プロシージャを終了できます。


$ ON WARNING THEN EXIT 

例: エラー発生後の再開

コマンド・プロシージャにこのコマンドが指定されている場合には,エラーまたは重大なエラーが発生するまで,コマンド・プロシージャは通常どおりに実行されます。


$ ON ERROR THEN GOTO ERR1 

このようなエラーが発生すると,プロシージャは ERR1 から実行を再開します。$STATUS と $SEVERITY は正常終了に設定され,省略時のエラー処理はリセットされます。別の ON コマンドまたは SET NOON コマンドが実行される前に,2 番目のエラーが発生した場合には,プロシージャは終了し,前のコマンド・レベルに戻ります。ON コマンドで指定されたアクションは,コマンドが実行されているコマンド・レベルでのみ適用されます。したがって,あるプロシージャ内で他のプロシージャを起動するように ON コマンドを使用した場合,ONコマンドのアクションはネストしたプロシージャには及びません。

図 13-1 は,ON コマンド・アクションを図式化しています。

図 13-1 ON コマンドのアクション


  1. この ON コマンドは,省略時のコマンド・アクション(警告の場合は処理を継続し,エラーまたは重大エラーの場合は終了する)を無効にする。A.FOR をコンパイル中にエラーまたは重大エラーが生じると,次のコマンドの処理に進む。

  2. 前の ON コマンドが有効な場合は,省略時のコマンド・アクションに戻るため,A.FOR と B.FOR の両方をコンパイル中にエラーまたは重大エラーが生じると,コマンド・プロシージャは終了する。

  3. C.FOR をコンパイル中に警告,エラーまたは重大エラーが生じると,コマンド・プロシージャは終了する。

  4. コマンドの実行前にコマンド・プロシージャが終了していなければ,そのコマンドが実行される。

付録 B のサンプル・コマンド・プロシージャ FORTUSER.COM と CALC.COM は,ON コマンドを使用してエラー処理を設定する方法を示しています。

13.10 SET NOON コマンドの使用方法

コマンド・プロシージャの中で SET NOON コマンドを使用すれば,コマンド・インタプリタがコマンドによって戻される状態をチェックしないようにできます。このコマンドは,ON コマンドを NO 状態に設定します。SET NOON コマンドを使用しても,コマンド・インタプリタは引き続き値を $STATUS と $SEVERITY に収めますが,エラー・チェックは行いません。エラー・チェック機能を再開させるには,SET ON コマンドまたは ON コマンドを使用します。

プロシージャでエラー・チェックが無効に設定されている場合には,コマンドまたはプログラムを実行した後,$STATUS の値を明示的にチェックできます。

次の例では,RUN コマンドの前に SET NOON コマンドが指定されているため,プログラム TESTA のまたは TESTB がエラーを戻した場合には,コマンド・プロシージャは実行を続行します。SET ON コマンドは,コマンド・インタプリタによる省略時のエラー・チェックを復元します。


$ SET NOON 
$ RUN TESTA 
$ RUN TESTB 
$ SET ON 

次の例では,最初の IF コマンドは,$STATUS の値が真であるかどうか(つまり,値が奇数の数値であるかどうか)を確認します。その場合には,FORTRAN コマンドは正常終了しており,LINK コマンドが実行されます。LINK コマンドを実行した後,$STATUS が再度テストされます。$STATUS の値が奇数である場合には,RUN コマンドが実行されます。奇数でない場合には,RUN コマンドは実行されません。SET ON コマンドは現在の ON 条件処理を復元します。つまり,SET NOON コマンドを実行する前に有効だった条件を復元します。


$ SET NOON 
$ FORTRAN MYFILE 
$ IF $STATUS THEN LINK MYFILE 
$ IF $STATUS THEN RUN MYFILE 
$ SET ON 

SET ON または SET NOON コマンドは,現在のコマンド・レベル,すなわちコマンドを実行するコマンド・レベルにだけ適用されます。別のコマンド・プロシージャを呼び出すコマンド・プロシージャの中で SET NOON コマンドを使用すると,ネストされたプロシージャの中では省略時のエラー・チェック方式が適用されます。SET NOON は,DCL レベルで会話形式で入力しても意味を持ちません。

13.11 Ctrl/Y による割り込み処理

省略時の設定では,コマンド・プロシージャの実行中に Ctrl/Y を押すと,コマンド・インタプリタは,Ctrl/Y コマンド・レベルと呼ばれる特別なコマンド・レベルでコマンド入力を求めるプロンプトを出します。Ctrl/Y コマンド・レベルでは,コマンド・インタプリタ内で実行される DCL コマンドを入力した後,CONTINUE コマンドを入力すれば,コマンド・プロシージャの実行を再開できます。また,コマンド・プロシージャの実行を強制的に終了する DCL コマンドを入力すれば,プロシージャを終了できます。

この節では,ON コマンドを使用することにより,コマンド・プロシージャが Ctrl/Y による割り込みを処理する方法の変更について説明します。

13.11.1 コマンド・プロシージャの中断

会話形式で実行中のコマンド・プロシージャを中断するには,Ctrl/Y を押します。Ctrl/Y を押すと,コマンド・インタプリタは Ctrl/Y レベルと呼ばれる新しいコマンド・レベルを設定して,コマンド入力を求めるプロンプトを出します。いつ中断が生じるかは,実行中のコマンドまたはプログラムによって異なります。

Ctrl/Y レベルでは,コマンド・インタプリタは以前に設定されたすべてのコマンド・レベルの状態を格納するため,Ctrl/Y による中断後に正しい状態を復元できます。

プロシージャの中断後は,次のようにします。

注意

Ctrl/Y を押した後に(コマンド・レベルから明示的に,またはONルーチンの一部として)コマンド・プロシージャを終了しない場合,次に入力されるコマンドはこのコマンド・プロシージャのコンテキストの中で解釈されます。たとえば,会話レベルで次のシンボルを定義したとします。


MAIL = "mail/edit=(send,reply,forward)" 

Ctrl/Y を押して,この定義を含まないコマンド・プロシージャを中断した後,MAIL コマンドを入力してメッセージを送信しても,エディタは自動的には起動されません。


前へ 次へ 目次 索引