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

前へ | 次へ | 目次 | 索引

## 16.20.1 条件コマンド実行のための PIPE コマンドの使用

先行するコマンド・シーケンスの実行結果により，次のコマンド・シーケンスが実行されます。

    PIPE   command-sequence1   &&   command-sequence2

command-sequence1 が成功した時のみ， command-sequence2 が実行される点に注意してください。次の形式を使用すると，command-sequence1 が失敗した時のみ command-sequence2 が実行されます。

    PIPE   command-sequence1   ||   command-sequence2

## 16.20.2 パイプライン実行のための PIPE コマンドの使用

パイプラインは，縦線(|)区切り文字で表されるパイプ で接続されたパイプライン・セグメント・コマンドのシーケンスです。パイプライン・セグメント・コマンドとは，パイプライン内の DCL コマンドです。パイプはパイプライン・セグメント・コマンドの SYS$OUTPUT を，次のコマンドの SYS$INPUT に接続します。パイプラインの形式を次に示します。

    PIPE pipeline-segment-command | pipeline-segment-command [|...]

各パイプライン・セグメント・コマンドは， SYS$OUTPUT を次のパイプライン・セグメント・コマンドの SYS$INPUT に接続し，別々のサブプロセスで実行されます。これらのサブプロセスはパラレルに実行されます。ただし，最初のパイプライン・セグメント・コマンドを除く各パイプライン・セグメント・コマンドが，その先行パイプライン・セグメント・コマンドの標準出力をその標準入力として読み込む程度に同期化されます。最後のパイプライン・セグメント・コマンドが終了すると，パイプラインは実行を終了します。

通常，パイプラインでは "フィルタ・アプリケーション"を使用します。フィルタ・アプリケーションとは，SYS$INPUT からのデータを取り，指定した方法でデータを変換し，それを SYS$OUTPUT に書き込むプログラムのことです。

パイプラインのコンテキストでは，DCL の機能は一部異なります。次に例を示します。

- SYS$COMMAND の使用
  サブプロセスの SYS$COMMAND は，通常，その SYS$INPUT(コマンド・プロシージャが関係しない場合)と同じです。ただしパイプラインでは，サブプロセスの SYS$COMMAND は，先行するパイプ(パイプライン・セグメント・コマンドの SYS$INPUT)ではなく，親プロセスの SYS$COMMAND に設定されます。

- SYS$PIPE の使用
  ほとんどの場合，パイプからの入力は， SYS$INPUT からデータを読み込むことにより取得できます。ただし，コマンド・プロシージャがパイプライン・セグメント・コマンドとして起動される場合は， SYS$INPUT はコマンド・プロシージャ・ファイルにリダイレクトされます。コマンド・プロシージャの中でパイプからデータを取得するには，論理名 SYS$PIPE を使用できます。
  次に，パイプライン DCL アプリケーション例 TEE.COM を示します。

              $ ! TEE.COM - command procedure to display/log data flowing through
              $ !           a pipeline
              $ ! Usage: @TEE log-file
              $
              $ OPEN/WRITE  tee_file 'P1'
              $ LOOP:
              $  READ/END_OF_FILE=EXIT  SYS$PIPE LINE
              $  WRITE SYS$OUTPUT LINE ! Send it out to the next stage of the pipeline
              $  WRITE tee_file LINE   ! Log output to the log file
              $  GOTO LOOP
              $ EXIT:
              $  CLOSE tee_file
              $  EXIT

  TEE.COM を使用する PIPE コマンドは，次のようになります。

      $ PIPE  SHOW SYSTEM | @TEE showsys.log | SEARCH SYS$INPUT LEF

  コマンド・プロシージャ TEE.COM は，パイプラインを流れるデータを記録します。データは，SYS$INPUT ではなく SYS$PIPE から読み込まれます。

- イメージのチェック
  パイプラインでは， PIPE コマンドを入力する前に SET VERIFY=IMAGE コマンドを実行した場合でも，省略時の設定でイメージのチェックはオフになっています。これにより，データ・レコードが重複してパイプラインを通過しないようになります。
  パイプラインでのイメージのチェックをオンにするには，パイプライン・セグメント・コマンドの前に明示的に SET VERIFY=IMAGE コマンドを使用しなければなりません。この場合，次のようにサブシェルを使用できます。

      $ PIPE ... | (SET VERIFY=IMAGE ; ...)  | ...

- ファイル・アクセス方法
  パイプライン・セグメント・コマンドは，パイプとの読み込みと書き込みに， RMS 順編成ファイル・アクセス方法しか使用できません。一部の OpenVMS ユーティリティは，順次アクセス以外の方法を使用して，入力ファイルや出力ファイルにアクセスすることがあります。これらの操作は，パイプラインではサポートされていないので失敗します。次の例を参照してください。

      $ PIPE CC/NOOBJ/NOLIS TEST.C | SEARCH SYS$INPUT/WIND=(1,1) "%cc-w-"

      %SEARCH-F-RFAERR, RMS error using RFA access
      -RMS-F-RAC, invalid record access mode

  この例では，SEARCH コマンドに /WINDOW 修飾子を指定して実行するためには，相対編成ファイル・アクセス方法が必要です。

## 16.20.3 サブシェル実行のための PIPE コマンドの使用

サブシェルは，区切り文字で区切られ，括弧で囲まれた 1 つまたは複数のコマンド・シーケンスです。サブシェルの形式を次に示します。

    PIPE   ( command-sequence [separator command-sequence]... )

サブシェル内のコマンド・シーケンスは，サブプロセス環境で実行されます。 DCL は，サブシェルが終了してから，次のコマンド・シーケンスを実行します。 ( )区切り文字は，SPAWN/WAIT コマンドに似ています。

## 16.20.4 バックグラウンド実行のための PIPE コマンドの使用

コマンド・シーケンスは，次の形式を使用してサブプロセス環境で実行されます。

    PIPE  command-sequence [ separator command-sequence]...  &

DCL は，コマンド・シーケンスの終了を待ちません。バックグラウンド・サブプロセスが作成されると，制御は DCL に戻ります。

## 16.20.5 入出力リダイレクトのための PIPE コマンドの使用

コマンド・シーケンスは，次のようにコマンドの実行中に， SYS$INPUT，SYS$OUTPUT，または SYS$ERROR をファイルにリダイレクトできます。

- SYS$INPUT をリダイレクトするには，次の形式を使用します。

         PIPE    command-sequence < redirected-input-file

- SYS$OUTPUT をリダイレクトするには，次の形式を使用します。

         PIPE    command-sequence > redirected-output-file

- SYS$ERROR をリダイレクトするには，次の形式を使用します。

         PIPE    command-sequence 2> redirected-error-file

パイプライン・セグメント・コマンドも， SYS$INPUT，SYS$OUTPUT，または SYS$ERROR をリダイレクトできます。ただし，SYS$OUTPUT のリダイレクトは，最後のパイプライン・セグメント・コマンドだけに使用でき， SYS$INPUT のリダイレクトは，最初のパイプライン・セグメント・コマンドだけに使用できます。

PIPE コマンドのリダイレクトは，DEFINE コマンドや ASSIGN コマンドを使用して行うリダイレクトとは異なります。相違点を以下に示します。

- リダイレクトは，スーパバイザ・モードで作成される。つまり，ユーザ・モード・アプリケーションと DCL コマンドの両方が，リダイレクトに影響される。

- リダイレクトされた環境は，リダイレクト構文を指定するコマンド・シーケンス，またはパイプライン・セグメント・コマンドだけに適用される。コマンド・シーケンスまたはパイプライン・セグメント・コマンドの実行後，コマンドの実行が続行される前に，元のプロセスの入出力環境(たとえば SYS$INPUT, SYS$OUTPUT，および SYS$ERROR)が復元される。

SYS$OUTPUT をリダイレクトすると，コマンド・シーケンスが実際に SYS$OUTPUT に書き込むかどうかにかかわらず，常にリダイレクトされた出力ファイルが作成されます。リダイレクトされた出力ファイルと同じ名前を持つファイルのバージョンがすでに存在する場合，そのファイルの新しいバージョンが作成されます。この動作は，スーパバイザ・モードで DEFINE または ASSIGN コマンドを使用して， SYS$OUTPUT を再定義する場合と同じです。リダイレクトされたファイルは，コマンド・シーケンスが実行される前に作成されることに注意してください。次の例のように，リダイレクトされたファイルがコマンド・シーケンスでも使用される場合は，操作が失敗することがあります。

    $ PIPE SEARCH TRANS.LOG "alpha" > TRANS.LOG
    %SEARCH-W-OPENIN, error opening TRANS.LOG;2 as input
    -RMS-E-FLK, file currently locked by another user

この例では，新しいバージョンの TRANS.LOG が作成され，書き込みアクセス用にオープンされます。次に SEARCH コマンドが，前のバージョンではなく最新バージョンの TRANS.LOG に読み込みアクセスしようとします。

SYS$ERROR をリダイレクトすると，コマンド・シーケンスが実行中に実際に SYS$ERROR に書き込む場合のみ，リダイレクトされたファイルが作成されます。リダイレクトされたエラー・ファイルと同じ名前を持つ既存のファイルは存在しません。リダイレクトされたエラー・ファイルと同じ名前を持つファイルがすでに存在する場合は，そのファイルがリダイレクトされたエラー・ファイルとしてオープンされます。次に，このコマンド・シーケンスで作成されたエラー出力は，リダイレクトされたエラー・ファイルの最後に追加されます。この動作は，スーパバイザ・モードで DEFINE または ASSIGN コマンドを使用して， SYS$ERROR を再定義する場合と同じです。

## 16.20.6 PIPE コマンドへの割り込み

Ctrl/Y を押すと，PIPE コマンドに割り込みをかけることができます。 PIPE コマンドをパイプラインまたはサブシェル・コマンド・シーケンスで実行している場合は，コマンド・シーケンスと PIPE コマンドが削除されます。この場合，割り込み直後に CONTINUE コマンドを入力しても， PIPE コマンドの実行は再開されません。

PIPE コマンドが，サブシェル・コマンド・シーケンスまたはパイプライン・コマンド・シーケンス以外の，コマンド・シーケンスを実行している場合は，DCL は，コマンド・シーケンスが PIPE コマンド動詞なしで入力され， Ctrl/Y で割り込みをかけられたように動作します。 Ctrl/Y 割り込みについての詳細は， 第 3.11.2 項 および 第 15.11 節 を参照してください。

## 16.20.7 サブプロセスの性能向上

PIPE コマンドは，実行中に多数のサブプロセスを作成できます。通常，コマンド・シーケンスにより起動されるアプリケーションは，プロセスの論理名とシンボル名に依存しません。この場合，/NOLOGICAL_NAME および /NOSYMBOLS 修飾子を使用すると，サブプロセスを素早く作成できます。これらの修飾子により，プロセスの論理名とシンボル名は， PIPE コマンドにより作成されたサブプロセスに渡されなくなります。

PIPE コマンドの使用例を次に示します。

- 次の例は，シンボル定義を持つ複数のコマンドを使用して，コマンド・プロシージャに有用なツールを作成する 2 つの簡単な方法を示しています。

      $ CD_WORK :== PIPE   SAVE_DIR=F$DIRECTORY() ; SET DEFAULT FOO:[WORK]
      $ BACK  :== SET DEF 'SAVE_DIR'
      $
      $ CD_WORK  ! Switch to working directory
      $     :
      $     :
      $ BACK     ! Switch back to home directory
      $ GET_RECORD :== PIPE READ/END_OF_FILE=CLEANUP IN RECORD ; -
                                      F$EDIT(RECORD, "COMPRESS, TRIM")
      $
      $ OPEN IN EMPLOYEE.DAT
      $ LOOP:
      $ GET_RECORD
      $    :
      $    :
      $ GOTO LOOP
      $
      $ CLEAN_UP:
      $    :

- 次の例は，コンパイルおよびリンク操作を示しています。コンパイル中にエラーが発生しなければ，オブジェクト・ファイルは実行可能イメージを生成するためにリンクされます。コンパイル・エラーが発生すると，リンクはスキップされます。

      $ PIPE cc foo.c && link foo, sys$library:vaxcrtl.olb/lib

- 次の例は，条件付きコマンドを実行して，コマンド・プロシージャ中にエラー処理制御フローを簡単に作成する方法を示しています。イメージ COLLECT_DATA が失敗すると，制御は CLEAN_UP に移ります。

      $ PIPE RUN COLLECT_DATA.EXE || GOTO CLEAN_UP
      $       :
      $       :
      $ EXIT
      $
      $ CLEAN_UP:
      $       :
      $       :

- この例の PIPE コマンドは，大きなファイルをコピーするためのバックグラウンド・プロセスを作成します。

      $ PIPE COPY LARGE_FILE.DAT REMOTE"user password"::[DESTINATION]*.*  &

- 次の例は，サブシェル・コマンド・シーケンスを，サブプロセスで実行しています。その結果，プロセス固有の属性(たとえば省略時のディレクトリ)を変更しても，サブシェルの終了後，現在のプロセスに影響しません。この例では，プログラム FOO を実行するために必要なデータを提供するため，セーブ・セットがサブディレクトリに復元されます。

      $ PIPE (SET DEF [.DATA_DIR] ; BACKUP  DATA.SAV/SAV [...]) ; RUN FOO

- 次の例は，パイプライン機能を使用して，システム上のすべてのバイバネート・プロセスを 1 つのコマンドで特定します。

      $ PIPE SHOW SYSTEM | SEARCH SYS$INPUT HIB

- 次の例は，パイプライン機能を使用して，1 つのコマンドでテストを実行し，その結果をソートし，結果をベンチマーク・ファイルと比較します。この時，不要な中間ファイルは生成します。

      $ PIPE RUN TEST | SORT/SPECIFICATION=TEST.SRT SYS$INPUT SYS$OUTPUT -
                | DIFF SYS$INPUT  TEST.BENCHMARK

- 次の例は，パイプラインで，パイプ・セグメント・コマンドとしてサブシェルを指定する 1 つの方法を示しています。

      $ PIPE  ( SET DEF WRK$:[WORK] ; RUN REPORT ) | MAIL SYS$INPUT SMITH

- 次の例は，パイプラインで /PAGE 修飾子を使用する例です。 /PAGE は，他の多数のコマンドにも存在し，同じように PIPE コマンドと組み合わせて使用して他の有用なツールを作成することができます。

      $ more :== TYPE/PAGE=SAVE SYS$INPUT
      $ PIPE    ANA/RMS PAGE.TXT | more

      Check RMS File Integrity                         26-JAN-1998 16:12:00.06  Page 1
      SYS$SYSDEVICE:[TEST]PAGE.TXT;2

      FILE HEADER

          File Spec: SYS$SYSDEVICE:[TEST]PAGE.TXT;2
          File ID: (4135,58220,0)
          Owner UIC: [PIPE]
          Protection:  System: RWED, Owner: RWED, Group: RE, World:
          Creation Date:   26-NOV-1998 16:08:50.05
          Revision Date:   26-NOV-1998 16:09:09.06, Number: 1
          Expiration Date: none specified
          Backup Date:     none posted
          Contiguity Options:  none
          Performance Options: none
          Reliability Options: none
          Journaling Enabled:  none

      RMS FILE ATTRIBUTES

      RETURN/SPACE=More, PREV/NEXT=Scroll, INS/REM=Pan, SELECT=80/132, Q=Quit

前へ | 次へ | 目次 | 索引