前へ | 次へ | 目次 | 索引 |
データやエラー・メッセージ,コマンド行のチェックなど,コマンド・プロシージャからの出力は,ターミナルまたは他のファイルに送信できます。この節では,次の出力方法について説明します。
シンボルやレキシカル関数を含むデータを書き込むには, WRITE コマンドを使用します。データを二重引用符(" ")で囲む場合を除いて,WRITE コマンドは自動的にシンボル置換を実行します。
次の例では,SYS$INPUT はデータ・ファイルとして指定されています。 TYPE コマンドは,その後に続くデータ行からデータを読み込み,データ行をターミナルに表示します。
$ ! Using TYPE to display lines $ TYPE SYS$INPUT REPORT BY MARY JONES PREPARED APRIL 15, 1995 SUBJECT: Analysis of Tax Deductions for 1995 . . . $ 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, 1996" Report by Mary Jones Prepared April 15, 1996 |
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シンボルの変換結果になっています。
16.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 |
これ以降の節では,エラー・メッセージの出力先を切り換える方法を説明します。
16.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 |
システム・メッセージが出力されないようにするために, SET MESSAGE コマンドを使用することもできます。 /NOFACILITY,/NOIDENTIFICATION,/NOSEVERITY,/NOTEXT のいずれかの修飾子を使用すれば,機能名,メッセージ識別,重大度レベル,メッセージ・テキストを出力しないように設定できます。
次の例では,2 番目の SET MESSAGE コマンドが実行されるまで,機能,識別,重大度,テキスト・メッセージの出力が一時的に禁止されます。
$ ! Purge files in a directory and suppress system messages $ ! $ SET DEFAULT 'P1' $ ! Suppress system messages $ ! $ SET MESSAGE/NOFACILITY - /NOIDENTIFICATION - /NOSEVERITY - /NOTEXT $ PURGE $ SET MESSAGE/FACILITY - /IDENTIFICATION - /SEVERITY /TEXT $ EXIT |
コマンド・プロシージャからファイルを読み込んだり,コマンド・プロシージャにファイルを書き込んだりするには,次のようにします。
手順 | 操作 |
---|---|
1 | OPEN コマンドを使用してファイルをオープンする。
OPEN コマンドは,論理名をファイルに割り当て,ファイルを読み込むのか,書き込むのか,または読み込みと書き込みを両方行うのかを指定する。これ以降の READ,WRITE,CLOSE コマンドは,この論理名を使用してファイルを参照する。 |
2 | READ または WRITE コマンドを使用して,ファイルからレコードを読み込んだり,ファイルにレコードを書き込んだりする。
ファイルへの入出力を行う 1 つの方法に,レコードを読み込んだり,レコードを処理したり,変更済みのレコードを同じファイルまたは別のファイルに書き込んだりするループを設計する方法がある。 |
3 | CLOSE コマンドを使用してファイルをクローズする。
CLOSE コマンドを取り込まない場合,ログアウトするまでファイルがオープンされたままになる。 |
ユーザがログインすると,システムが SYS$INPUT,SYS$OUTPUT,SYS$COMMAND, SYS$ERROR の各ファイルを自動的にオープンするため,これらのファイルを読み書きのために明示的にオープンする必要はありません。 |
この後の節では,次のことについて説明します。
OPEN コマンドは,順編成ファイル,相対編成ファイル,索引順編成ファイルをオープンします。ファイルはプロセス永久ファイルとしてオープンされ, CLOSE コマンドでファイルを明示的にクローズしない限り,プロセスが存在する間はオープンされたままになります。ファイルがオープンされているときは,プロセス永久ファイルの使用に関する OpenVMS RMS の制限事項に従います。
OPEN コマンドは,ファイルをオープンすると,論理名 (最初のパラメータとして指定される)をファイル (2 番目のパラメータとして指定される) に割り当て,その名前をプロセス論理名テーブルに収めます。これ以降の READ,WRITE,CLOSE コマンドはこの論理名を使用してファイルを参照します。
次の例では,OPEN コマンドは,論理名 INFILE を DISK4:[MURPHY]STATS.DAT ファイルに割り当てます。
$ OPEN/READ INFILE DISK4:[MURPHY]STATS.DAT |
OPEN コマンドの中の論理名は固有の名前でなければなりません。入力したコマンドは正しいのに,OPEN コマンドが動作しない場合には, OPEN コマンドの中の論理名を変更します。論理名定義のリストを表示するには,SHOW LOGICAL コマンドを使用します。 |
コマンド・プロシージャが正しいファイルにアクセスできるようにするには,完全なファイル指定 (たとえば,DISK4:[MURPHY]STATS.DAT) を使用するか,ファイルをオープンする前に SET DEFAULT コマンドを使用して正しいデバイスとディレクトリを指定します。
共用可能ファイルも指定できます。 /SHARE 修飾子を使用すると,他の開かれているファイルをアクセス可能に設定できます。さらに,ユーザは DCL コマンド TYPE と SEARCH を使用して,共用可能ファイルにアクセスできます。
OPEN/READ コマンドはファイルを開き,論理名をファイルに割り当て,レコード・ポインタをファイルの先頭に設定します。読み込みの対象としてファイルを開く場合には,レコードを読み込むことはできますが,書き込むことはできません。レコードを読み込むたびに,ポインタは次のレコードに移動します。
このコマンド・プロシージャの OPEN/READ コマンドは,ファイル STATS.DAT を開き,論理名 INFILE をファイルに割り当てます。
$ OPEN/READ INFILE DISK4:[MURPHY]STATS.DAT $ READ_FILE: $ READ/END_OF_FILE=DONE INFILE DATA $ GOTO READ_FILE $ DONE: $ CLOSE INFILE $ EXIT |
新しいファイルに書き込む場合には,OPEN/WRITE コマンドを使用します。 OPEN/WRITE コマンドは印刷ファイル形式で順編成ファイルを作成します。ファイルのレコード形式は固定長制御部付き可変長 (VFC) であり, 2 バイトのレコード・ヘッダが付いています。 /WRITE 修飾子を /APPEND 修飾子と組み合わせて使用することはできません。
既存のファイルを指定した場合には,OPEN/WRITE コマンドは,既存のファイルより 1 つだけバージョン番号の大きい新しいファイルを開きます。
次の例のコマンド・プロシージャは,書き込みのために使用できる新しいファイル (NAMES.DAT) を作成します。
$ OPEN/WRITE OUTFILE DISK4:[MURPHY]NAMES.DAT $ UPDATE: $ INQUIRE NEW_RECORD "Enter name" $ WRITE OUTFILE NEW_RECORD $ IF NEW_RECORD .EQS. "" THEN GOTO EXIT_CODE $ GOTO UPDATE $ EXIT_CODE: $ CLOSE OUTFILE $ EXIT |
OPEN/APPEND コマンドは,既存のファイルの最後にレコードを追加します。存在しないファイルを開こうとした場合には,エラーが発生し,ファイルは開かれません。 /APPEND 修飾子を /WRITE 修飾子と組み合わせて使用することはできません。
次の例では,レコードが既存のファイル,NAMES.DAT の最後に追加されます。
$ OPEN/APPEND OUTFILE DISK4:[MURPHY]NAMES.DAT $ INQUIRE NEW_RECORD "Enter name" $ WRITE OUTFILE NEW_RECORD . . . $ CLOSE OUTFILE |
OPEN/READ/WRITE コマンドは,レコード・ポインタをファイルの先頭に設定し,最初のレコードを読み込むことができるようにします。この方法を使用してファイルを開く場合には,最後に読み込んだレコードだけを置換できます。新しいレコードをファイルの最後に書き込むことはできません。さらに,変更されたレコードは,置換されるレコードと正確に同じサイズでなければなりません。
次の例では,レコード・ポインタがファイル STATS.DAT の先頭に設定され,最初のレコードを読み込むことができるようにします。
$ OPEN/READ/WRITE FILE DISK4:[MURPHY]STATS.DAT |
前へ | 次へ | 目次 | 索引 |