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

前へ | 次へ | 目次 | 索引

# C.6 EDITALL.COM コマンド・プロシージャ

EDT エディタを繰り返し起動して，同じファイル・タイプを持つファイルのグループを編集します。このプロシージャは，レキシカル関数を使用して出力からファイル名を取り出す方法を示しています。また，コマンド・プロシージャの中で起動されたプログラムの入力ストリームを再定義する方法も示しています。

例: EDITALL.COM

    $ ! Procedure to edit all files in a directory with a
    $ ! specified file type. Use P1 to indicate the file type.
    $ !
    $ ON CONTROL_Y THEN GOTO DONE           ! Ctrl/Y action    (1)
    $ ON ERROR THEN GOTO DONE
    $ !
    $ ! Check for file type parameter.  If one was entered, continue;
    $ ! otherwise, prompt for a parameter.
    $ !
    $ IF P1 .NES. "" THEN GOTO OKAY                            (2)
    $ INQUIRE P1 "Enter file type of files to edit"
    $ !
    $ ! List all files with the specified file type and write the DIRECTORY
    $ ! output to a file named DIRECT.OUT
    $ !
    $ OKAY:
    $ DIRECTORY/VERSIONS=1/COLUMNS=1 -                         (3)
             /NODATE/NOSIZE -
             /NOHEADING/NOTRAILING -
             /OUTPUT=DIRECT.OUT *.'P1'
    $ IF .NOT. $STATUS THEN GOTO ERROR_SEC                     (4)
    $ !
    $ OPEN/READ/ERROR=ERROR_SEC DIRFILE DIRECT.OUT             (5)
    $ !
    $ ! Loop to read directory file
    $ !
    $ NEWLINE:                                                 (6)
    $        READ/END=DONE DIRFILE NAME
    $        DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:   ! Redefine SYS$INPUT
    $        EDIT 'NAME'                               ! Edit the file
    $        GOTO NEWLINE
    $ !
    $ DONE:                                                    (7)
    $        CLOSE DIRFILE/ERROR=NOTOPEN               ! Close the file
    $ NOTOPEN:
    $        DELETE DIRECT.OUT;*                       ! Delete temp file
    $ EXIT
    $ !
    $ ERROR_SEC:
    $        WRITE SYS$OUTPUT "Error:  ",F$MESSAGE($STATUS)
    $        DELETE DIRECT.OUT;*
    $ EXIT

EDITALL.COM コマンド・プロシージャの説明

1. ON コマンドは，このプロシージャの条件処理を設定する。このプロシージャの実行時に Ctrl/Y が押されると，DONE ラベルに分岐する。同様に，エラーまたは重大エラーが生じても，DONE ラベルに分岐する。

2. パラメータが入力されたかどうかをチェックする。入力されていない場合には，ファイル・タイプを求めるプロンプトを出す。

3. DIRECTORY コマンドは，P1 として指定されたファイル・タイプを持つすべてのファイルをリストする。コマンド出力は DIRECT.COM ファイルに書き込まれる。 /VERSIONS=1 修飾子は，それぞれのファイルの最も大きいバージョン番号だけをリストするように要求する。 NOHEADING 修飾子と/NOTRAILING 修飾子は，出力に見出し行やディレクトリ要約を含めないように要求する。 /COLUMNS=1 修飾子は，レコードごとにファイル名が 1 つずつ指定されるようにする。

4. IF コマンドは，$STATUS の値をテストすることによって， DIRECTORY コマンドからの戻り値をチェックする。 DIRECTORY コマンドが正しく実行されないと，$STATUS は偶数の整数値になり，プロシージャはERROR_SEC ラベルに分岐する。

5. OPEN コマンドは，ディレクトリ出力ファイルをオープンして，それに論理名 DIRFILE を指定する。

6. READ コマンドは，DIRECTORY コマンド出力の行をシンボル名 NAME に読み込む。すべての行を読み込むと，DEFINE コマンドを使用して，編集セッションの入力ストリーム (SYS$INPUT) がターミナルになるように再定義する。次に，エディタを起動して，NAME シンボルをファイル指定として指定する。編集セッションが完了すると，コマンド・インタプリタは，コマンド・プロシージャの中の次の行を読み込んで，NEWLINE ラベルに分岐する。ディレクトリの中にある指定されたファイル・タイプのすべてのファイルを編集すると，DONEラベルに分岐する。

7. DONE ラベルは，READ コマンドの /END 修飾子のターゲット・ラベルであるとともに，プロシージャの始めに設定された ON CONTROL_Y 条件と ON ERROR 条件のターゲット・ラベルでもある。このラベルでは，クリーンアップ処理を行う。
   CLOSE コマンドは，DIRECTORY コマンドの出力ファイルをクローズし， /ERROR 修飾子はファイルの中の次の行のラベルを指定する。このように/ERROR 修飾子を使用すると，ディレクトリ・ファイルがオープンされていないときに表示されるはずのエラー・メッセージが出されなくなる。このような状況は，ディレクトリ・ファイルをオープンする前に Ctrl/Y を押した場合などに生じる。
   クリーンアップ処理の 2 番目のステップは，一時ディレクトリ・ファイルを削除することである。

EDITALL.COM コマンド・プロシージャの実行結果例

    $ @EDITALL DAT
    *  .
       .
       .
    %DELETE-I-FILDEL, device:[directory]DIRECT.OUT;1 deleted (x blocks)

EDITALL プロシージャが DAT として指定された P1 によって起動されます。このプロシージャは，省略時のディレクトリにあるファイル・タイプ DAT を持つすべてのファイルのディレクトリ・リストを作成し，エディタを起動してそれぞれのファイルを編集します。ファイル・タイプ DAT を持つ最後のファイルを編集し終わると，一時ファイル DIRECT.OUT を削除して，ターミナルにメッセージを表示します。

# C.7 MAILEDIT.COM コマンド・プロシージャ

このコマンド・プロシージャは， MAIL ユーティリティでテキスト・エディタを起動しています。

例: MAILEDIT.COM

    $ ! Command procedure to invoke an editor for Mail.
    $ !
    $ ! Inputs:
    $ !
    $ !     P1 = Input file name.
    $ !     P2 = Output file name.
    $ !
    $ ! If MAIL$EDIT is undefined, Mail will invoke the user's selected
    $ ! callable editor set by the mail SET EDITOR command.
    $ !
    $ ! If MAIL$EDIT is defined to be a command procedure, Mail will create
    $ ! a subprocess to edit the mail, but any SET EDITOR command in Mail
    $ ! will override the definition of MAIL$EDIT for the remainder of that
    $ ! Mail session.
    $ !
    $ ! Note that this procedure is run in the context of a subprocess.
    $ ! LOGIN.COM is not executed.  However, all process logical names
    $ ! and DCL global symbols are copied.  In particular, note that the
    $ ! user's individual definition of the symbol EDIT is used if there
    $ ! is one. Otherwise, the system default editor is used.
    $ !
    $ ! The default directory is the same as the parent process
    $ !
    $ DEFINE /USER SYS$INPUT 'F$TRNLNM("SYS$OUTPUT")'          (1)
    $ IF P1 .EQS. "" THEN GOTO NOINPUT                         (2)
    $ EDIT /OUTPUT='P2' 'P1'                                   (3)
    $ EXIT
    $NOINPUT:
    $ EDIT 'P2'                                                (4)
    $ EXIT

MAILEDIT.COM コマンド・プロシージャの説明

1. DEFINE コマンドは，エディタ入力をコマンド・ファイルからではなく，ターミナルから得られるようにする。

2. IF 文は，異なる出力ファイル名を持つファイルを編集することと，同じファイル名を持つファイルを編集することを区別する。

3. この EDIT コマンドは，入力ファイル名と出力ファイル名でエディタを起動する。この行を，たとえば次のように編集すると，ユーザが選択したエディタを起動できる。
   `$ RUN XYZ_EDITOR.EXE /INPUT= 'P1' /OUTPUT='P2'`

4. この EDIT コマンドは，1 つのファイル名でエディタを起動する。この行を，たとえば次のように編集すると，ユーザが選択したエディタを起動できる。
   `$ RUN XYZ_EDITOR.EXE /INPUT= 'P2' /OUTPUT='P2'`

MAILEDIT.COM コマンド・プロシージャの実行結果例

    $DEFINE MAIL$EDIT MAILEDIT.COM
    $MAIL
    MAIL> SHOW EDITOR
    Your editor is defined by the file MAILEDIT.COM.

# C.8 FORTUSER.COM コマンド・プロシージャ

FORTRAN プログラムの作成，コンパイル，実行を行う会話型ユーザの，ターミナル環境を制御するシステム定義のログイン・コマンド・プロシージャのサンプルを示します。 FORTUSER.COM が，ログイン・コマンド・プロシージャとしてリストされる専用アカウントにログインした場合は， FORTUSER.COM が受け入れるコマンドしか実行できません。このプロシージャは，レキシカル関数を使用してオプション・テーブルを参照し，ユーザが入力したコマンドと有効なコマンドのリストとを比較する方法も示しています。

例: FORTUSER.COM

    $ ! Procedure to create, compile, link, execute, and debug
    $ ! FORTRAN programs.  Users can enter only the commands listed
    $ ! in the symbol OPTION_TABLE.
    $ SET NOCONTROL=Y                                          (1)
    $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
    $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
    $ OPTION_TABLE = "EDIT/COMPILE/LINK/RUN/EXECUTE/DEBUG/PRINT/HELP/FILE/DONE/"  (2)
    $ TYPE SYS$INPUT                                           (3)

            VMS FORTRAN Command Interpreter

            Enter name of file with which you would like to work.
    $ !
    $ ! Set up for initial prompt
    $ !
    $ PROMPT = "INIT"                                          (4)
    $ GOTO HELP                      ! Print the initial help message
    $ !
    $ ! after the first prompting message, use the prompt: Command
    $ !
    $ INIT:
    $ PROMPT = "GET_COMMAND"
    $ GOTO FILE                      ! Get initial file name
    $ !
    $ ! Main command parsing routine.  The routine compares the current
    $ ! command against the options in the option table.  When it finds
    $ ! a match, it branches to the appropriate label.
    $ !
    $ GET_COMMAND:
    $       ON CONTROL_Y THEN GOTO GET_COMMAND     ! Ctrl/Y resets prompt  (5)
    $       SET CONTROL=Y
    $       ON WARNING THEN GOTO GET_COMMAND       ! If any, reset prompt
    $       INQUIRE COMMAND "Command"
    $       IF COMMAND .EQS. "" THEN GOTO GET_COMMAND
    $       IF F$LOCATE(COMMAND + "/", OPTION_TABLE) .EQ. F$LENGTH(OPTION_TABLE) - (6)
                   THEN GOTO INVALID_COMMAND
    $       GOTO 'COMMAND'
    $ !
    $ INVALID_COMMAND:                                         (7)
    $       WRITE SYS$OUTPUT " Invalid command"
    $ !
    $ HELP:                                                    (8)
    $       TYPE SYS$INPUT
            The commands you can enter are:
            FILE      Name of FORTRAN program in your current
                      default directory.  Subsequent commands
                      process this file.
            EDIT      Edit the program.
            COMPILE   Compile the program with FORTRAN.
            LINK      Link the program to produce an executable image.
            RUN       Run the program's executable image.
            EXECUTE   Same function as COMPILE, LINK, and RUN.
            DEBUG     Run the program under control of the debugger.
            PRINT     Queue the most recent listing file for printing.
            DONE      Return to interactive command level.
            HELP      Print this help message.

            Enter Ctrl/Y to restart this session
    $ GOTO 'PROMPT'                                            (9)
    $ EDIT:                                                    (10)
    $       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
    $       EDIT 'FILE_NAME'.FOR
    $       GOTO GET_COMMAND
    $ COMPILE:
    $       FORTRAN 'FILE_NAME'/LIST/OBJECT/DEBUG
    $       GOTO GET_COMMAND
    $ LINK:
    $       LINK 'FILE_NAME'/DEBUG
    $       PURGE 'FILE_NAME'.*/KEEP=2
    $       GOTO GET_COMMAND
    $ RUN:
    $       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
    $       RUN/NODEBUG 'FILE_NAME'
    $       GOTO GET_COMMAND
    $ DEBUG:
    $       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
    $       RUN 'FILE_NAME'
    $       GOTO GET_COMMAND
    $ EXECUTE:
    $       FORTRAN 'FILE_NAME'/LIST/OBJECT
    $       LINK/DEBUG 'FILE_NAME'
    $       PURGE 'FILE_NAME'.*/KEEP=2
    $       RUN/NODEBUG 'FILE_NAME'
    $       GOTO GET_COMMAND
    $ PRINT:
    $       PRINT 'FILE_NAME'
    $       GOTO GET_COMMAND
    $ BADFILE:                                                 (11)
    $       WRITE SYS$OUTPUT "File must be in current default directory."
    $ FILE:
    $       INQUIRE FILE_NAME "File name"
    $       IF FILE_NAME .EQS. "" THEN GOTO FILE
    $       IF F$PARSE(FILE_NAME,,,"DIRECTORY") .NES. F$DIRECTORY() -  (12)
            THEN GOTO BADFILE
    $       FILE_NAME = F$PARSE(FILE_NAME,,,"NAME")
    $       GOTO GET_COMMAND
    $ DONE:
    $ EXIT

FORTUSER.COM コマンド・プロシージャの説明

1. SET NOCONTROL=Y コマンドは，このプロシージャの制御下でログインするユーザが，プロシージャまたはプロシージャの中のコマンドやプログラムに割り込めないようにする。

2. このオプション・テーブルには，ユーザが実行できるコマンドがリストされる。それぞれのコマンドはスラッシュによって区切られている。

3. プロシージャ自体を示している。

4. シンボル名 PROMPT にプロシージャの中のラベルの値が割り当てられる。プロシージャを初めて起動するとき，このシンボルの値は INIT になる。 HELP コマンド・テキストは，PROMT ラベルを指定する GOTO コマンドで終了する。このテキストを初めて表示する場合には， GOTO コマンドの結果，HELP ラベルに分岐する。このとき，ユーザが入力可能なコマンドを示す HELP メッセージが表示される。次に，プロシージャは INIT ラベルに戻って，そこで PROMT の値を "GET_COMMAND" に変更し，最後に，FILE ラベルに分岐して，ファイル名を得る。これ以降は，ヘルプ・テキストが表示されると， GET_COMMAND ラベルに分岐して，次のコマンドを得る。

5. Ctrl/Y 条件アクションが，警告条件アクションと同じように， GET_COMMAND ラベルに戻るように設定される。プロシージャは，コマンドを求めるプロンプトを出し，入力があるまでプロンプトを出し続ける。セッションを終了して会話型コマンド・レベルに戻るには，DONE コマンドを入力する。

6. F$LOCATE レキシカル関数と F$LENGTH レキシカル関数を使用して，オプションのリストにコマンドが指定されているかどうかを判別する。 F$LOCATE 関数は，ユーザが入力したコマンドで末尾にスラッシュが付くものを検索する。たとえば，EDIT と入力すると，EDIT/ を検索する。オプション・リストにコマンドが指定されていない場合には，プロシージャは INVALID_COMMAN ラベルに分岐する。オプション・リストにコマンドが指定されている場合は，該当するラベルに分岐する。

7. INVALID_COMMAND ラベルで，プロシージャはエラー・メッセージを出し，有効なコマンドの一覧を示すヘルプ・テキストを表示する。

8. ヘルプ・テキストには，有効なコマンドがリストされる。このテキストは一番最初に表示される。また，ユーザが HELP コマンドや無効なコマンドを入力したときも表示される。

9. HELP テキストの末尾の GOTO コマンドはシンボル名 PROMPT を指定している。このプロシージャを初めて起動するとき，このシンボルはINIT の値になり，それ以降は GET_COMMAND の値になる。

10. リストの中の有効な各コマンドは，オプション・テーブルに対応するエントリを持ち，コマンド・プロシージャの中に対応するラベルを持つ。ターミナルから入力を読み込む EDIT などのコマンドの場合は，入力ストリームを SYS$COMMAND として定義する DEFINE コマンドがプロシージャに含まれる。

11. BADFILE ラベルで，プロシージャはファイルが現在のディレクトリになくてはならないことを示すメッセージを表示する。次に，別のファイル名を求めるプロンプトを出す。

12. ファイル名を得ると，現在の省略時のディレクトリ以外のディレクトリをユーザが指定しなかったかどうかをチェックする。ここで F$PARSE 関数を使用して，ファイル名を取り出す (それぞれのコマンドには，該当する省略時のファイル・タイプがある)。次に，GET_COMMAND ラベルに戻って，ファイルを処理するコマンドを得る。

FORTUSER.COM コマンド・プロシージャの実行結果例

この例は，このコマンド・プロシージャを専用コマンド・プロシージャとして使用する方法を示しています。

    Username: CLASS30
    Password:

                OpenVMS Version 7.1

        OpenVMS FORTRAN Command Interpreter

        Enter name of file with which you would like to work.

        The commands you can enter are:

        FILE       Name of FORTRAN program in your current
                   default directory.  Subsequent commands
                   process this file.
        EDIT       Edit the program.
        COMPILE    Compile the program with VAX FORTRAN.
        LINK       Link the program to produce an executable image.
        RUN        Run the program's executable image.
        EXECUTE    Same function as COMPILE, LINK and RUN.
        DEBUG      Run the program under control of the debugger.
        PRINT      Queue the most recent listing file for printing.
        DONE       Return to interactive command level.
        HELP       Print this help message.

        Enter Ctrl/Y to restart this session
    File name: AVERAGE
    Command: COMPILE
    Command: LINK
    Command: RUN
    Command: FILE
    File name: READFILE
    Command: EDIT

このサンプル実行は，CLASS30 というユーザが FORTUSERコマンド・プロシージャによって制御されるアカウントにログインするときのセッションを示しています。 FORTUSER コマンド・プロシージャは，ユーザが実行できるコマンドと，セッションを再開するための命令を表示します。次に，ユーザが AVERAGE ファイルを指定して，それをコンパイル，リンク，実行します。この後，ユーザは FILE コマンドを入力して，別のファイルで作業を開始します。

前へ | 次へ | 目次 | 索引