前へ | 次へ | 目次 | 索引 |
レキシカル関数は,DCL インタプリタが評価して置換するコマンド言語構造です。 DCL インタプリタはレキシカル関数を検出すると,まずこれを評価し置換した後でコマンド文字列を解釈します。本章では,次のことを説明します。
レキシカル関数についての詳しい説明は,オンライン・ヘルプを参照してください。本章で説明するコマンドについての詳細は,『Compaq OpenVMS DCL ディクショナリ』を参照してください。
17.1 レキシカル関数について
レキシカル関数を使用すると,次のことに関する情報を入手できます。
多くのレキシカル関数が戻す情報は,DCL コマンドからも得ることができます。
17.1.1 情報の取得
コマンドから情報を得るよりもレキシカル関数から情報を得た方が,コマンド・プロシージャの中で情報を処理しやすくなります。たとえば,F$ENVIRONMENT 関数または SHOW DEFAULT コマンドのどちらを使用しても,現在の省略時のディレクトリの名前を得ることができます。ただし,次の点が異なります。
$ DIR_NAME = F$ENVIRONMENT("DEFAULT") $ SET DEFAULT DISK4:[TEST] . . . $ SET DEFAULT 'DIR_NAME' |
上記の例で,F$ENVIRONMENT 関数は,現在の省略時のディスクとディレクトリを戻し,この値を DIR_NAME シンボルに格納する。プロシージャの終わりに,この DIR_NAME シンボルを使用して SET DEFAULT コマンドによって省略時の値に戻している。
$! Redirect the output of the SHOW DEFAULT command to a file. $ DEFINE/SUPERVISOR_MODE SYS$OUTPUT DISK4:[TEST]TEMPFILE.DAT $ SHOW DEFAULT $ DEASSIGN SYS$OUTPUT $! $ OPEN/READ DIR_FILE DISK4:[TEST]TEMPFILE.DAT ! Open the file. $ READ DIR_FILE DIR_NAME, ! Read the file. $ SET DEFAULT 'DIR_NAME' ! Reset the directory. $ CLOSE DIR_FILE ! Close the file. $ DELETE DISK4:[TEST]TEMPFILE.DAT;* ! Delete the file. |
コマンド・プロシージャを実行している間,プロセス属性を頻繁に変更し,その後で属性を復元します。次のレキシカル関数を使用すれば,プロセスに関する情報を入手できます。
F$DIRECTORY | 現在の省略時のディレクトリ文字列を戻す。 |
F$ENVIRONMENT | ユーザ・プロセスのコマンド環境についての情報を戻す。 |
F$GETJPI | ユーザ・プロセスまたはシステム上の他のプロセスについての会計情報,状態,識別情報を戻す。 |
F$MODE | プロセスを実行中のモードを示す。 |
F$PRIVILEGE | ユーザ・プロセスに特権が指定されているかどうかを示す。 |
F$PROCESS | プロセスの名前を戻す。 |
F$SETPRV | 指定された特権を設定する。指定された特権が, F$SETPRV 関数を使用する前に使用可能であったかどうかも示す。 |
F$USER | UIC (ユーザ識別コード)を戻す。 |
F$VERIFY | チェック機能のオンまたはオフを示す。 |
次の表は,コマンド・プロシージャで一般に変更されるプロセス属性を示しています。また,これらの属性をセーブするレキシカル関数と,元の設定を復元する DCL コマンドも示しています。
属性 | 操作 | コマンドまたはレキシカル関数 |
---|---|---|
制御文字 | セーブ | F$ENVIRONMENT("CONTROL") |
復元 | SET CONTROL | |
DCL プロンプト | セーブ | F$ENVIRONMENT("PROMPT") |
復元 | SET PROMPT | |
省略時の保護 | セーブ | F$ENVIRONMENT("PROTECTION") |
復元 | SET PROTECTION/DEFAULT | |
キー状態 | セーブ | F$ENVIRONMENT("KEY_STATE") |
復元 | SET KEY | |
メッセージ形式 | セーブ | F$ENVIRONMENT("MESSAGE") |
復元 | SET MESSAGE | |
特権 | セーブ | F$PRIVILEGE または F$SETPRV |
復元 | F$SETPRV または SET PROCESS/PRIVILEGES | |
チェック機能 | セーブ | F$VERIFY または F$ENVIRONMENT |
復元 | F$VERIFY または SET VERIFY |
プロセス属性をセーブした場合,エラーまたは Ctrl/Y による割り込みによって,元の属性を復元する前にプロシージャが終了することのないようにしなければなりません。エラーと Ctrl/Y による割り込みの処理については, 第 15 章 を参照してください。
17.2.1 チェック設定値の変更
F$VERIFY レキシカル関数を使用すると,コマンド・プロシージャが実行されている間だけチェック機能を無効にすることができます。このとき,ユーザは,プロシージャを実行しながらそのプロシージャの内容を表示することはできません。
チェック機能には,次の 2 つのタイプがあります。
省略時の設定では,SET [NO]VERIFY コマンドと F$VERIFY レキシカル関数は,両方のタイプのチェック機能をオン,オフします。通常は,プロシージャの中のプロージャおよびイメージ・チェック設定値は同じになっています (両方がオンか,両方がオフになっています)。ただし,設定値を変更する場合には,それぞれのチェック設定値を別々にセーブします。
次の例では,シンボル TEMP を使用して,チェック機能を有効および無効に設定します。
$ ! Enable verification $ ! $ TEMP = F$VERIFY(1) $ LOOP: $ INQUIRE FILE "File name" $ IF FILE .EQS."" THEN EXIT $ PRINT 'FILE' $ GOTO LOOP $ ! Disable verification $ ! $ TEMP = F$VERIFY(0) $ EXIT |
次の例では,チェック機能の設定がセーブされます。
$ ! Save each verification state $ ! Turn both states off $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) . . . $ ! Restore original verification states $ SAVE_VERIFY_IMAGE = F$VERIFY(SAVE_VERIFY_PROCEDURE,- SAVE_VERIFY_IMAGE) |
上記の例で,F$ENVIRONMENT 関数は,現在のイメージ・チェック設定値を戻し,この値を SAVE_VERIFY_IMAGE シンボルに割り当てています。次に,F$VERIFY 関数が現在のプロシージャ・チェック設定値を戻し,この値を SAVE_VERIFY_PROCEDURE シンボルに割り当てています。 F$VERIFY 関数は,イメージ・チェックとプロシージャ・チェックの両方を無効にします。 F$ENVIRONMENT 関数を使用すれば,F$VERIFY によってチェック機能を無効にする前にプロシージャ・チェック設定値を得ることができます。ただし,上記の例に示すように,F$VERIFY を使用して 1 つのコマンド行の中で両方のタスクを行った方がプロシージャの長さが短くてすみます。
プロシージャの終わりに,F$VERIFY 関数で元の設定値 (シンボル SAVE_VERIFY_PROCEDURE と SAVE_VERIFY_IMAGE によって指定される) を復元しています。
時刻印字を使用する場合,チェック機能が使用可能な場合にだけ適用されることに注意してください。時刻印字と SET PREFIX コマンドについての詳細は,『Compaq OpenVMS DCL ディクショナリ』または DCL ヘルプを参照してください。 |
コマンド・プロシージャの中で省略時のファイル保護を変更したい場合があります。次のコマンド・プロシージャは,プロシージャの実行中に作成されたファイルに関連する省略時の保護を変更します。この場合,終了する前に元の省略時のファイル保護を復元しています。
$ SAVE_PROT = F$ENVIRONMENT("PROTECTION") $ SET PROTECTION = (SYSTEM:RWED, OWNER:RWED, GROUP, WORLD)/DEFAULT . . . $ SET PROTECTION=('SAVE_PROT')/DEFAULT $ EXIT |
この例で,F$ENVIRONMENT 関数は,SET PROTECTION コマンドの構文を使用して省略時の保護コードを戻しています。このため,SET PROTECTION コマンドと一緒に SAVE_PORT シンボルを使用して元の省略時のファイル保護を復元できます。
17.3 システムについての情報
システムについての情報を得るには,次のレキシカル関数を使用します。
F$CONTEXT | F$PID 関数と一緒に使用する場合の選択基準を指定する。 F$CONTENT 関数と一緒に F$PID 関数を使用すると,OpenVMS Cluster の任意のノードのプロセスについての情報を得ることができる。 |
F$CSID | VMS クラスタ識別番号を戻して,システムのVMS クラスタ・ノード・リストの中の現在の位置を指すようにコンテキスト・シンボルを更新する。 |
F$GETQUI | システム・ジョブ・キュー・ファイルに収められたキュー,現在キューの中にあるバッチ・ジョブと印刷ジョブ,フォーム定義,属性定義についての情報を戻す。 |
F$GETSYI | ローカル・システムまたは VMS クラスタ内のノード (システムが VMS クラスタの一部である場合) についての情報を戻す。 |
F$IDENTIFIER | 識別子を指定された形式から数値形式に,または数値形式から指定された形式に変換する。 |
F$MESSAGE | 状態コードに関連するメッセージ・テキストを戻す。 |
F$PID | ユーザがチェックすることが許容されているプロセスのプロセス識別番号 (PID) を戻す。 |
F$TIME | 現在の日時を戻す。 |
使用中のシステムがネットワークまたは OpenVMS Clusterの一部で,多数のノードにログインできる場合には,現在使用中のノードを示すように DCL プロンプトを設定できます。このためには,ログイン・コマンド・プロシージャの中に F$GETSYI 関数を指定して,ノード名を判別します。次に,SET PROMPT コマンドを使用して,ノード固有のプロンプトを設定します。
プロンプト文字列の中でノード名の一部分だけを使用したい場合には, F$EXTRACT 関数を使用して,該当する文字を取り出します。文字の取り出しについては, 第 17.6.2 項 を参照してください。
次の例では,シンボル NODE が FF$GETSYI("NODENAME") として定義され,その後,ノード名がプロンプトとして使用されます。
$ NODE = F$GETSYI("NODENAME") $ SET PROMPT = "''NODE'$ " . . . |
F$GETQUI 関数を使用すると,バッチ・キューと印刷キューについての各種の情報を得ることができます。キューの中のジョブやファイルについての情報を得るには,該当ジョブに対する読み込みアクセス権か SYSPRV または OPER 特権を持っていなくてはなりません。
次の例は,バッチ・キュー VAX1_BATCH が終了状態にあるかどうかを判別する方法を示しています。戻される値は真か偽のいずれかです。キューが終了状態にない場合には,コマンド・プロシージャはジョブをキューに登録します。
$ QSTOPPED = F$GETQUI("DISPLAY_QUEUE", "QUEUE_STOPPED", "VAX1_BATCH") $ IF QSTOPPED THEN GOTO NOBATCH $ SUBMIT/QUEUE=VAX1_BATCH TEST.COM $ NOBATCH: . . . |
F$PID 関数を使用すると,チェックすることが許容されているすべてのプロセスのプロセス識別番号 (PID) を得ることができます。
PID 番号を入手した後,F$GETJPI 関数を使用すれば,プロセスに関する特定の情報を入手できます。
次の例は,チェックすることが許容されているプロセスの PID を得て表示する方法を示しています。
$ ! Display the time when this procedure $ ! begins executing $ WRITE SYS$OUTPUT F$TIME() $ ! $ CONTEXT = "" $ START: $ ! Obtain and display PID numbers until $ ! F$PID returns a null string $ ! $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ WRITE SYS$OUTPUT "Pid --- ''PID'" $ GOTO START |
システムは CONTEXT シンボルを使用して,ポインタを PID のシステム・リストに保持しています。ループを通過するたびに,ポインタを変更して,リストの中の次の PID を指すようにします。すべての PID が表示されると,プロシージャは終了します。
次のプロシージャは,PID とそれぞれのプロセスの UIC を表示します。
$ CONTEXT = "" $ START: $ ! Obtain and display PID numbers and UICs $ ! $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ UIC = F$GETJPI(PID,"UIC") $ WRITE SYS$OUTPUT "Pid --- ''PID' Uic--- ''UIC' " $ GOTO START |
WRITE コマンドの中に F$GETJPI 関数を指定すれば,このコマンド・プロシージャを短くできます。
$ CONTEXT = "" $ START: $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ WRITE SYS$OUTPUT "Pid --- ''PID' Uic --- ''F$GETJPI(PID,"UIC")'" $ GOTO START |
OpenVMS Cluster 内の任意のノードからプロセスに関する情報を入手するには, F$CONTEXT 関数を使用します。
次の例では,選択基準を設定するために F$CONTEXT が 3 回呼び出されています。
$!Establish an error and Ctrl/Y handler $! $ ON ERROR THEN GOTO error $ ON CONTROL_Y THEN GOTO error $! $ ctx = "" $ temp = F$CONTEXT ("PROCESS", ctx, "NODENAME", "*","EQL") (1) $ temp = F$CONTEXT ("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL") (2) $ temp = F$CONTEXT ("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL") (3) $! $!Loop over all processes that meet the selection criteria. $!Print the PID number and the name of the image for each process. $! $loop: (4) $ pid = F$PID(ctx) $ IF pid .EQS. "" $ THEN $ GOTO endloop $ ELSE $ image = F$GETJPI(pid,"IMAGNAME") (5) $ SHOW SYMBOL pid $ WRITE SYS$OUTPUT image (6) $ GOTO loop $ ENDIF $!The loop over the processes has ended. $! $endloop: $! $ EXIT $! $!Error handler. Clean up the context's memory with $!the CANCEL selection item keyword. $! $error: $ IF F$TYPE(ctx) .eqs. "PROCESS_CONTEXT" THEN - (7) -$ temp = F$CONTEXT ("PROCESS", ctx, "CANCEL") (8) $! $ EXIT |
例を調べる場合には,次のことに注意してください。
前へ | 次へ | 目次 | 索引 |