日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
OpenVMS
|
目次 | 索引 |
14.20.1 条件コマンド実行のための PIPE コマンドの使用 |
先行するコマンド・シーケンスの実行結果により,次のコマンド・シーケンスが実行されます。
PIPE command-sequence1 && command-sequence2 |
command-sequence1 が成功した時のみ, command-sequence2 が実行される点に注意してください。次の形式を使用すると,command-sequence1 が失敗した時のみ command-sequence2 が実行されます。
PIPE command-sequence1 || command-sequence2 |
14.20.2 パイプライン実行のための PIPE コマンドの使用
パイプラインは,縦線(|)区切り文字で表されるパイプで接続されたパイプライン・セグメント・コマンドのシーケンスです。パイプライン・セグメント・コマンドとは,パイプライン内の DCL コマンドです。パイプはパイプライン・セグメント・コマンドの SYS$OUTPUT を,次のコマンドの SYS$INPUT に接続します。パイプラインの形式を次に示します。
PIPE pipeline-segment-command | pipeline-segment-command [|...] |
各パイプライン・セグメント・コマンドは, SYS$OUTPUT を次のパイプライン・セグメント・コマンドの SYS$INPUT に接続し,別々のサブプロセスで実行されます。これらのサブプロセスはパラレルに実行されます。ただし,最初のパイプライン・セグメント・コマンドを除く各パイプライン・セグメント・コマンドが,その先行パイプライン・セグメント・コマンドの標準出力をその標準入力として読み込む程度に同期化されます。最後のパイプライン・セグメント・コマンドが終了すると,パイプラインは実行を終了します。
通常,パイプラインでは "フィルタ・アプリケーション" を使用します。フィルタ・アプリケーションとは,SYS$INPUT からのデータを取り,指定した方法でデータを変換し,それを SYS$OUTPUT に書き込むプログラムのことです。
パイプラインのコンテキストでは,DCL の機能は一部異なります。次に例を示します。
$ 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 修飾子を指定して実行するためには,相対編成ファイル・アクセス方法が必要です。
$ ! 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 ; ...) | ... |
14.20.3 サブシェル実行のための PIPE コマンドの使用
サブシェルは,区切り文字で区切られ,括弧で囲まれた 1 つまたは複数のコマンド・シーケンスです。サブシェルの形式を次に示します。
PIPE ( command-sequence [separator command-sequence]... ) |
サブシェル内のコマンド・シーケンスは,サブプロセス環境で実行されます。 DCL は,サブシェルが終了してから,次のコマンド・シーケンスを実行します。 ( )区切り文字は,SPAWN/WAIT コマンドに似ています。
この形式の PIPE コマンドを使用するときには,シンボルの置換の扱いに注意してください。シンボルを定義した後,そのシンボルを使用するときには,シンボルの前にアンパサンド (&) を付けてシンボルの置換を遅延させます。アンパサンドを付けなかった場合,シンボルの置換はコマンド処理の第 1 フェーズで行われ,シンボルの定義が信頼できないものになります。
14.20.4 バックグラウンド実行のための PIPE コマンドの使用
コマンド・シーケンスは,次の形式を使用してサブプロセス環境で実行されます。
PIPE command-sequence [ separator command-sequence]... & |
DCL は,コマンド・シーケンスの終了を待ちません。バックグラウンド・サブプロセスが作成されると,制御は DCL に戻ります。
14.20.5 入出力リダイレクトのための PIPE コマンドの使用
コマンド・シーケンスは,次のようにコマンドの実行中に, SYS$INPUT,SYS$OUTPUT,または SYS$ERROR をファイルにリダイレクトできます。
PIPE command-sequence < redirected-input-file |
PIPE command-sequence > redirected-output-file |
PIPE command-sequence 2> redirected-error-file |
パイプライン・セグメント・コマンドも,SYS$INPUT,SYS$OUTPUT,または SYS$ERROR をリダイレクトできます。ただし,SYS$OUTPUT のリダイレクトは,最後のパイプライン・セグメント・コマンドだけに使用でき, SYS$INPUT のリダイレクトは,最初のパイプライン・セグメント・コマンドだけに使用できます。
PIPE コマンドのリダイレクトは, DEFINE コマンドや ASSIGN コマンドを使用して行うリダイレクトとは 異なります。相違点を以下に示します。
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 を再定義する場合と同じです。
14.20.6 PIPE コマンドへの割り込み
Ctrl/Y を押すと,PIPE コマンドに割り込みをかけることができます。 PIPE コマンドをパイプラインまたはサブシェル・コマンド・シーケンスで実行している場合は,コマンド・シーケンスと PIPE コマンドが削除されます。この場合,割り込み直後に CONTINUE コマンドを入力しても, PIPE コマンドの実行は再開されません。
PIPE コマンドが,サブシェル・コマンド・シーケンスまたはパイプライン・コマンド・シーケンス以外の,コマンド・シーケンスを実行している場合は,DCL は,コマンド・シーケンスが PIPE コマンド動詞なしで入力され, Ctrl/Y で割り込みをかけられたように動作します。Ctrl/Y 割り込みについての詳細は, 第 13.11 節 を参照してください。
PIPE コマンドは,実行中に多数のサブプロセスを作成できます。通常,コマンド・シーケンスにより起動されるアプリケーションは,プロセスの論理名とシンボル名に依存しません。この場合,/NOLOGICAL_NAME および /NOSYMBOLS 修飾子を使用すると,サブプロセスを素早く作成できます。これらの修飾子により,プロセスの論理名とシンボル名は, PIPE コマンドにより作成されたサブプロセスに渡されなくなります。
PIPE コマンドの使用例を次に示します。
14.20.7 サブプロセスの性能向上
$ 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
$ PIPE RUN COLLECT_DATA.EXE || GOTO CLEAN_UP
$ :
$ :
$ EXIT
$
$ CLEAN_UP:
$ :
$ :
$ PIPE COPY LARGE_FILE.DAT REMOTE"user password"::[DESTINATION]*.* &
$ PIPE (SET DEF [.DATA_DIR] ; BACKUP DATA.SAV/SAV [...]) ; RUN FOO
$ PIPE SHOW SYSTEM | SEARCH SYS$INPUT HIB
$ PIPE RUN TEST | SORT/SPECIFICATION=TEST.SRT SYS$INPUT SYS$OUTPUT -
| DIFF SYS$INPUT TEST.BENCHMARK
$ PIPE ( SET DEF WRK$:[WORK] ; RUN REPORT ) | MAIL SYS$INPUT SMITH
$ more :== TYPE/PAGE=SAVE SYS$INPUT
$ PIPE ANA/RMS PAGE.TXT | more
Check RMS File Integrity 26-JAN-2002 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-2002 16:08:50.05
Revision Date: 26-NOV-2002 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
目次 | 索引 |
|