前へ | 次へ | 目次 | 索引 |
コマンド・プロシージャのデータを会話形式で入手するには,INQUIRE コマンド(第 13 章 を参照)または READ コマンドを使用できます。どちらのコマンドも,入力を要求するプロンプトを表示し,応答をシンボルに割り当てます。
READ コマンドと INQUIRE コマンドの相違点は次のとおりです。
INQUIRE コマンド | READ コマンド |
---|---|
値を要求するプロンプト | 値を要求するプロンプト |
ターミナルから値を読み込む | 最初のパラメータによって指定されたソースから値を読み込む |
値をシンボルに割り当てる | 2 番目のパラメータとして指定されたシンボルに値を割り当てる。 |
READ コマンドは,プロンプトに対する応答としてターミナルに入力されたすべての文字を,正確な文字列値として受け付けます(大文字と小文字の区別,スペース,タブは保存されます)。/PROMPT 修飾子を省略した場合には,READ コマンドは省略時のプロンプトとして Data: を表示します。
入力されたパラメータを受け付けることができ,また,必須パラメータが指定されなかったときに,ユーザ入力を要求するプロンプトを表示するコマンド・プロシージャを作成することもできます。
次の例では,コマンドは Filename: というプロンプトをターミナルに表示し,論理名 SYS$COMMAND(省略時の設定ではターミナル)によって指定されるソースから応答を読み込み,応答をシンボル FILE に割り当てます。
$ READ/PROMPT="Filename: " SYS$COMMAND FILE |
次の例では,プロシージャを起動したときに,ファイル名が指定されなかった場合には,ファイル名を要求するプロンプトが表示されます。
$ ! Prompt for a file name if name $ ! is not passed as a parameter $ IF P1 .EQS. "" THEN INQUIRE P1 "Filename" $ COPY 'P1' DISK5:[RESERVED]*.* $ EXIT |
コマンド・プロシージャをキューに登録して,バッチ・ジョブとして実行する場合,DCL は,INQUIRE コマンドに続くデータ行から INQUIRE コマンドに指定されたシンボルの値を読み込みます。データ行を指定しない場合には,シンボルには空値が割り当てられます。 |
コマンド,ユーティリティ,その他のシステム・イメージは,省略時の
入力ストリーム である論理名 SYS$INPUT に指定されるソースから入力を取得します。コマンド・プロシージャの中では,SYS$INPUT はコマンド・プロシージャ・ファイルとして定義され,データを必要とするコマンドやイメージはこのファイルの中でデータ行を検索します。ただし,SYS$INPUT を再定義すれば,ターミナルや別の入力ファイルからデータを得ることができます。
14.6.1 ターミナルとしての SYS$INPUT の再定義
SYS$INPUT をターミナルとして再定義できます。このようにすると,コマンド・プロシージャから呼び出されたイメージは,コマンド・プロシージャ内のデータ行からではなく,会話形式で入力を入手できます。
コマンド・プロシージャで会話型入力を必要とする DCL コマンドやユーティリティを使用する場合には,SYS$INPUT をターミナルとして再定義しなければなりません。
たとえば,次のコマンド・プロシージャは,入力を会話形式で CENSUS.EXE イメージに提供できるようにします。
$ ! Execute CENSUS getting data from the terminal $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND $ RUN CENSUS $ EXIT |
DEFINE/USER_MODE コマンドは,CENSUS.EXE を実行しながら,SYS$INPUT を一時的に再定義するため,CENSUS.EXE はターミナルから入力を受け入れます。CENSUS.EXE が終了すると,SYS$INPUT は元の定義(コマンド・プロシージャ・ファイル)に戻されます。
たとえば,次のコマンド・プロシージャはEVE エディタを使用します。
$ ! Obtain a list of your files $ DIRECTORY $ ! $ ! Get file name and invoke the EVE editor $ EDIT_LOOP: $ INQUIRE FILE "File to edit(Press Return to end)" $ IF FILE .EQS. "" THEN EXIT $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND $ EDIT/TPU 'FILE' $ GOTO EDIT_LOOP |
このコマンド・プロシージャは,ユーザが Returnキーを押してループを終了するまで,ファイル名を求めるプロンプトを出します。ファイル名を入力すると,プロシージャは自動的に EVE エディタを起動してファイルを編集します。エディタの実行中,SYS$INPUT はターミナルとして定義されるので,編集内容を会話形式で入力できます。
14.6.2 SYS$INPUT を個別ファイルとして定義する場合
SYS$INPUT をファイルとして定義すれば,コマンド・プロシージャはファイルから入力を得ることができます。コマンド・プロシージャは,データ行のテキストをコマンドまたはイメージに直接渡すことに注意してください。DCL はデータ行は処理しません。データ行に DCL シンボルや式を指定しても,DCL は値をシンボルに置換しませんし,式を評価しません。データ行で感嘆符を使用すると,データを渡す先のイメージが感嘆符(!)を処理します。
データ・ファイルの名前を SYS$INPUT として指定すれば,コマンド・プロシージャ・ファイルにプログラムを登録できます。この操作を実行すると,コンパイラは別のファイルではなく,コマンド・プロシージャからプログラムを読み込みます。
次の例は,FORTRAN コマンドの後にプログラムの文が続くコマンド・プロシージャを示しています。
$ FORTRAN/OBJECT=TESTER/LIST=TESTER SYS$INPUT C THIS IS A TEST PROGRAM A = 1 B = 2 STOP END $ PRINT TESTER.LIS $ EXIT |
FORTRAN コマンドは,論理名 SYS$INPUT を使用してコンパイルするファイルを識別します。SYS$INPUT はコマンド・プロシージャとして定義されているため,FORTRANコンパイラは,FORTRAN コマンドに続く文を(始めにドル記号が付く次の行まで)コンパイルします。コンパイルが終了すると,2 つの出力ファイル TESTER.OBJ と TESTER.LIS が作成されます。このとき,PRINT コマンドは,リスト・ファイルを印刷します。
14.7 コマンド・プロシージャ出力の実行
データやエラー・メッセージ,コマンド行のチェックなど,コマンド・プロシージャからの出力は,ターミナルまたは他のファイルに送信できます。この節では,次の出力方法について説明します。
シンボルやレキシカル関数を含むデータを書き込むには,WRITE コマンドを使用します。データを二重引用符(" ")で囲む場合を除いて,WRITE コマンドは自動的にシンボル置換を実行します。
次の例では,SYS$INPUT はデータ・ファイルとして指定されています。TYPE コマンドは,その後に続くデータ行からデータを読み込み,データ行をターミナルに表示します。
$ ! Using TYPE to display lines $ TYPE SYS$INPUT REPORT BY MARY JONES PREPARED APRIL 15, 2002 SUBJECT: Analysis of Tax Deductions for 2002 . . . $ EXIT |
シンボルやレキシカル関数を含むデータを書き込むには,WRITE コマンドを使用します。データを二重引用符(" ")で囲む場合を除いて,WRITE コマンドは自動的にシンボル置換を実行します。
WRITE コマンドを使用して,文字列をリテラル・テキストとして表示するには,二重引用符(" ")で囲みます。たとえば,次のようになります。
$ WRITE SYS$OUTPUT "Two files are written." Two files are written. |
文字列の中に二重引用符を指定するには,2 組の二重引用符("" "")を使用します。たとえば,次のようになります。
$ WRITE SYS$OUTPUT "Summary of ""Q & A"" Session" Summary of "Q & A" Session |
テキスト行を 2 行以上に継続するには,2 つの文字列をプラス記号(+)とハイフン(-)で連結します。たとえば,次のようになります。
$ WRITE SYS$OUTPUT "Report by Mary Jones" + - " Prepared April 15, 2002" Report by Mary Jones Prepared April 15, 2002 |
WRITE コマンドは,シンボル置換を自動的に実行し,シンボルの値を表示します。文字列内でシンボル置換を強制的に実行するには,シンボルを一重引用符で囲みます。たとえば,次のようになります。
$ AFILE = "STAT1.DAT" $ BFILE = "STAT2.DAT" $ WRITE SYS$OUTPUT "''AFILE' and ''BFILE' ready." STAT1.DAT and STAT2.DAT ready. |
この例では,STAT1.DAT が AFILE シンボルの変換結果で,STAT2.DAT が BFILEシンボルの変換結果になっています。
14.7.2 コマンドとイメージからの出力先の切り換え
コマンド,ユーティリティ,その他のシステム・イメージは,論理名SYS$OUTPUT によって指定されるソースに出力を書き込みます。省略時の設定では,SYS$OUTPUT はターミナルに定義されます。ただし,次のいずれかの方法を使用すれば,出力先を切り換えることができます。
次の例では,コマンド・プロシージャは,SHOW USERS コマンドからの出力をファイルに切り換えます。SYS$OUTPUT の新しい定義は,SHOW USERS コマンドの実行に対してだけ有効になります。
$ DEFINE/USER_MODE SYS$OUTPUT SHOW_USER.DAT $ SHOW USERS $ ! $ ! Process the information in SHOW_USER.DAT $ OPEN/READ INFILE SHOW_USER.DAT $ READ INFILE RECORD . . . $ CLOSE INFILE $ EXIT |
次の例では,SYS$OUTPUT はヌル・デバイス(NL:)として定義されています。
$ DEFINE/USER_MODE SYS$OUTPUT NL: $ APPEND NEW_DATA.DAT STATS.DAT . . . |
/USER_MODE 修飾子は,次のイメージが完了するまでの間だけ有効な一時的な論理名割り当てを作成します。このコマンドを実行すると,SYS$OUTPUT は省略時の定義(ターミナル)に戻ります。
DEFINE/USER_MODE コマンドを使用しても,コマンド・インタプリタの中で実行される DCL コマンドの出力先を切り換えることはできません。この場合には,DEFINE コマンドを使用して SYS$OUTPUT を再定義し,処理が終了したら,DEASSIGN コマンドを使用して定義を削除します。
次の表は,コマンド・インタプリタの内部で実行される DCL コマンドを示しています。
= | ALLOCATE | ASSIGN |
ATTACH | CALL | CANCEL |
CLOSE | CONNECT | CONTINUE |
CREATE/LOGICAL_NAME_TABLE | DEALLOCATE | DEASSIGN |
DEBUG | DECK | DEFINE |
DEFINE/KEY | DELETE/SYMBOL | DISCONNECT |
ELSE | ENDIF | ENDSUBROUTINE |
EOD | EXAMINE | EXIT |
GOSUB | GOTO | IF |
INQUIRE | ON | OPEN |
READ | RECALL | RETURN |
SET CONTROL | SET DEFAULT | SET KEY |
SET ON | SET OUTPUT_RATE | SET PROMPT |
SET PROTECTION/DEFAULT | SET SYMBOL/SCOPE | SET UIC |
SET VERIFY | SHOW DEFAULT | SHOW KEY |
SHOW PROTECTION | SHOW QUOTA | SHOW STATUS |
SHOW SYMBOL | SHOW TIME | SHOW TRANSLATION |
SPAWN | STOP | SUBROUTINE |
THEN | WAIT | WRITE |
次の例では,SHOW TIME コマンドからの出力をファイル TIME.DAT に切り換えるために使用されるコマンドを示しています。SYS$OUTPUT の割り当てを解除した後,省略時の定義(ターミナル)に戻ります。
$ DEFINE SYS$OUTPUT TIME.DAT $ SHOW TIME $ DEASSIGN SYS$OUTPUT |
グローバル・シンボルと論理名は,コマンド・プロシージャのデータを呼び出し側プロシージャまたは DCL コマンド・レベルに戻します。グローバル・シンボルや論理名は,どのコマンド・レベルでも読み込めます。論理名は,ネストされたコマンド・プロシージャから呼び出し側のプロシージャにデータを戻すことができます。
次の例では,グローバル割り当て文で作成されたグローバル・シンボルを使用して,コマンド・プロシージャが値を渡す方法を示しています。
$ @DATA "Paul Cramer" $ ! DATA.COM $ ! $ ! P1 is a full name. $ ! NAME.COM returns the last name in the $ ! global symbol LAST_NAME. $ ! $ @NAME 'P1' $ ! NAME.COM $ ! P1 is a first name $ ! P2 is a last name $ ! return P2 in the global symbol LAST_NAME $ LAST_NAME == P2 $ EXIT $ ! write LAST_NAME to the terminal $ WRITE SYS$OUTPUT "LAST_NAME = ''LAST_NAME'" LAST_NAME = CRAMER |
DATA.COM は,コマンド・プロシージャ NAME.COM を起動し,NAME.COM に姓名を渡します。NAME.COM はグローバル・シンボル LAST_NAME に姓を格納します。NAME.COM が終了すると,DCL は DATA.COM の実行を続行し,このコマンド・プロシージャは,グローバル・シンボル LAST_NAME を指定することにより,姓を読み込みます。コマンド・プロシージャ NAME.COM は別のファイルに格納されています。この例では,わかりやすくするためにインデントを使用して示しています。
このコマンド・プロシージャでは,REPORT.COM はレポートのファイル名を入手し,ファイル名を論理名 REPORT_FILE に等しく定義し,レポートを REPORT_FILE に書き込むプログラムを実行します。
$! Obtain the name of a file and then run $! REPORT.EXE to write a report to the file $! $ INQUIRE FILE "Name of report file" $ DEFINE/NOLOG REPORT_FILE 'FILE' $ RUN REPORT $ EXIT |
次の例では,コマンド・プロシージャ REPORT.COM は別のプロシージャから起動されます。呼び出し側のプロシージャは,論理名 REPORT_FILE を使用して,レポート・ファイルを参照します。
$! Command procedure that updates data files $! and optionally prepares reports $! $ UPDATE: . . . $ INQUIRE REPORT "Prepare a report [Y or N]" $ IF REPORT THEN GOTO REPORT_SEC $ EXIT $! $ REPORT_SEC: $ @REPORT $ WRITE SYS$OUTPUT "Report written to ", F$TRNLNM("REPORT_FILE") $ EXIT |
これ以降の節では,エラー・メッセージの出力先を切り換える方法を説明します。
14.7.4.1 SYS$ERROR の再定義
省略時の設定では,コマンド・プロシージャは,SYS$ERROR に示されるファイルにシステム・エラー・メッセージを送信します。SYS$ERROR を再定義すれば,エラー・メッセージを指定するファイルに書き出すこともできます。ただし,SYS$ERROR を SYS$OUTPUT と異なるように再定義すると(SYS$ERROR を再定義せずに SYS$OUTPUT を再定義すると),標準 VMS システム・エラー表示方式を使用する DCL コマンドやイメージは,システム・エラー・メッセージとシステム重大エラー・メッセージを SYS$ERROR と SYS$OUTPUT の両方に送信します。したがって,ユーザはこれらのメッセージを,SYS$ERROR の定義に示されるファイルで 1 回と,SYS$OUTPUT に示されるファイルで 1 回の合計 2 回受信することになります。成功メッセージ,通知メッセージ,警告メッセージは,SYS$OUTPUT に示されるファイルにだけ送信されます。
DCL コマンドからエラー・メッセージが出されないようにしたい場合は,SYS$ERROR も SYS$OUTPUT もターミナルに定義しないようにします。
コマンド・プロシージャから自分のイメージを実行するときに,そのイメージで SYS$ERROR を参照する場合には,イメージはシステム・エラー・メッセージを,SYS$ERROR によって示されるファイルにだけ送信します。SYS$ERROR が SYS$OUTPUT と異なる場合でも,この規則が適用されます。SYS$ERROR と SYS$OUTPUT が異なる場合には,標準的なシステム・エラー表示メカニズムを使用する DCL コマンドとイメージだけが,この 2 つのファイルにメッセージを送信します。
このコマンド・プロシージャはパラメータとしてディレクトリ名を受け付け,省略時の値をそのディレクトリに設定し,ディレクトリ内のファイルをパージします。システム・エラー・メッセージが出力されないようにするために,プロシージャは,SYS$ERROR と SYS$OUTPUT をヌル・デバイスとして一時的に定義します。
$ ! Purge files in a directory and suppress messages $ ! $ SET DEFAULT 'P1' $ ! Suppress messages $ ! $ DEFINE/USER_MODE SYS$ERROR NL: $ DEFINE/USER_MODE SYS$OUTPUT NL: $ PURGE $ EXIT |
前へ | 次へ | 目次 | 索引 |