HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
PIPE コマンド・シーケンス ; コマンド・シーケンス [; コマンド・シーケンス]... |
PIPE コマンド・シーケンス1 && コマンド・シーケンス2 |
次の形式を使用すると,コマンド・シーケンス 1 が失敗した場合のみ,コマンド・シーケンス 2 は実行されます。
PIPE コマンド・シーケンス1 || コマンド・シーケンス2 |
PIPE パイプライン・セグメント・コマンド | パイプライン・セグメント・コマンド [|...] |
各パイプライン・セグメント・コマンドは, SYS$OUTPUT を次のパイプライン・セグメント・コマンドの SYS$INPUT に接続し,別々のサブプロセスで実行されます。これらのサブプロセスは,パラレルに実行されます。ただし,最初のパイプライン・セグメント・コマンドを除く各パイプライン・セグメント・コマンドが,その先行パイプライン・セグメント・コマンドの標準出力をその標準入力として読み込むという意味で同期化されます。パイプラインは,最後のパイプライン・セグメント・コマンドが終了すると,実行を終了します。
通常,パイプラインでは,「フィルタ・アプリケーション」を使用します。フィルタ・アプリケーションとは,SYS$INPUT からのデータを取り,特定の方法でデータを変換し,SYS$OUTPUT に書き込むプログラムのことです。
PIPE ( コマンド・シーケンス [区切り文字 コマンド・シーケンス]... ) |
サブシェル内のコマンド・シーケンスは,サブプロセス環境で実行されます。 DCL は,サブシェルが終了してから,次のコマンド・シーケンスを実行します。 ( ) 区切り文字は,SPAWN/WAIT コマンドに似ています。
PIPE コマンド・シーケンス [ 区切り文字 コマンド・シーケンス]... & |
DCL は,コマンド・シーケンスの終了を待ちません。バックグラウンド・サブプロセスが作成されると,制御は DCL に戻ります。
PIPE コマンド・シーケンス < リダイレクトする入力ファイル |
SYS$OUTPUTをリダイレクトするには,次のように実行します。
PIPE コマンド・シーケンス > リダイレクトする出力ファイル |
SYS$ERRORをリダイレクトするには,次のように実行します。
PIPE コマンド・シーケンス 2 > リダイレクトするエラー・ファイル |
パイプライン・セグメント・コマンドも,SYS$INPUT,SYS$OUTPUT,または SYS$ERROR をリダイレクトできます。ただし, SYS$OUTPUT リダイレクトは最後のパイプライン・セグメント・コマンドだけに使用でき,SYS$INPUT リダイレクトは最初のパイプライン・セグメント・コマンドだけに使用できます。
Ctrl/Y を押すと,PIPE コマンドに割り込みをかけることができます。 PIPE コマンドがパイプラインまたはサブシェル・コマンド・シーケンスを実行していると,コマンド・シーケンスおよび PIPE コマンドは削除されます。この場合,割り込み直後に CONTINUE コマンドを入力しても, PIPE コマンドの実行は再開されません。
PIPE コマンドが,サブシェルまたはパイプライン・コマンド・シーケンス以外のコマンド・シーケンスを実行していた場合, DCL は,コマンド・シーケンスが PIPE コマンド動詞なしで入力され, Ctrl/Y で割り込みをかけられたように動作します。 Ctrl/Y 割り込みについての詳細は,『OpenVMS ユーザーズ・マニュアル』を参照してください。
各コマンド・シーケンスは,実行を終了すると,グローバル・シンボル $STATUS に戻り値を設定します。 PIPE コマンドの戻り状態は,最後のセグメントで 最後に実行されたコマンド・シーケンスの戻り状態です。したがって,すべてのセグメントがエラーのために失敗しても,最後のセグメントが正常終了すれば, DCL には正常終了の状態が戻されます。
PIPE コマンドを ON 条件処理でコマンド・プロシージャで実行すると,コマンド・シーケンスの条件付き実行 (&&, ||) は,先に ON 条件文で指定された動作より優先します。
PIPE コマンドは,そのコマンド・シーケンス用に特殊な実行コンテキストを作成します。一部の DCL コマンドは,このコンテキストで動作しないか,新しい動作を示します。次に,そのコマンドを示します。
$ TYPE FOO.COM
$ ! FOO.COM
$ :
$ PIPE ...
$ :
$
$ PIPE @FOO.COM ; ...
|
この例で,FOO.COM の内側にある PIPE コマンドは,異なるコマンド・プロシージャ・レベルで実行されるので使用できます。
PIPE コマンドは,実行中に多数のサブプロセスを作成できます。通常,コマンド・シーケンスで起動されるアプリケーションは,プロセスの論理名とシンボル名に依存しません。この場合,/NOLOGICAL_NAMES および /NOSYMBOLS 修飾子を使用すると,サブプロセスを素早く作成できます。この修飾子により,プロセスの論理名とシンボルは, PIPE コマンドで作成されたサブプロセスに渡されなくなります。
DCL のユーザは,DEFINE または ASSIGN コマンドを使用して,SYS$INPUT, SYS$OUTPUT,または SYS$ERROR をリダイレクトできます。このようなリダイレクトは,ユーザ・モード (/USER_MODE 修飾子を使用 ) またはスーパバイザ・モード (/SUPERVISOR_MODE 修飾子を使用 ) のリダイレクトとして実行できます。ユーザ・モード・リダイレクトは,次のユーザ・モード・イメージの環境だけに影響します。
PIPE コマンドでは,リダイレクトは,リダイレクト構文を使用して実行できます。 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 を再定義する場合と同じです。
この節では,パイプラインのコンテキストで一部異なる DCL の機能について説明します。
次の構造のいくつかは,TEE を実現するために使用されます。
サブプロセスの SYS$COMMAND は,通常,その SYS$INPUT( コマンド・プロシージャが関係しない場合 ) と同じです。ただしパイプラインでは,サブプロセスの SYS$COMMAND は,先行するパイプ (パイプライン・セグメント・コマンドの SYS$INPUT) でなく,親プロセスの SYS$COMMAND に設定されます。
ほとんどの場合,パイプからの入力は,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 修飾子には,相対編成ファイル・アクセス方法が必要です。
/LOGICAL_NAMES(省略時)
/NOLOGICAL_NAMES
プロセスの論理名と論理名テーブルを,コマンド・シーケンスのサブプロセスにコピーします。省略時の設定では,明示的に CONFINE のマークが付いたものとエグゼクティブ・モードまたはカーネル・モードで作成されたものを除き,すべてのプロセス論理名と論理名テーブルがサブプロセスにコピーされます。/PRIVILEGES={CURRENT|AUTHORIZED}
サブプロセスが,現在のプロセスの現在の特権と許可されている特権のどちらを,許可された特権として継承するかを決定します。省略時の設定では,サブプロセスの許可された特権マスクは,作成者の現在の特権から継承されます。これは,/PRIVILEGES=CURRENT に対応します。 /PRIVILEGES=AUTHORIZED 修飾子を指定すると,サブプロセスの許可された特権は,作成者の許可された特権から継承されます。/SYMBOLS(省略時)
/NOSYMBOLS
($RESTART,$SEVERITY,および $STATUSを除く ) グローバル・シンボルとローカル・シンボルを,サブプロセスへ渡すかどうかを指定します。 $RESTART,$SEVERITY,および $STATUS シンボルは,サブプロセスに渡されません。/TRUSTED
/NOTRUSTED
PIPE コマンドの入力が,信用できるコマンド・プロシージャから行われることを指定します。 PIPE コマンドは,CAPTIVE アカウントでは使用できません。 /TRUSTED 修飾子は,コマンドの入力がキャプティブ・コマンド・プロシージャ内の信用できる場所で行われる場合,正しくコーディングされたキャプティブ・コマンド・プロシージャが, PIPE 操作を実行する方法を提供します。信用できるコマンド・プロシージャについての詳細は,『OpenVMS システム・セキュリティ・ガイド』を参照してください。
| #1 |
|---|
$ PIPE SHOW SYSTEM | SEARCH SYS$INPUT HIB |
この例は,1 つのコマンドでパイプライン機能を使用して,システムのすべてのハイバネート・プロセスを特定します。
| #2 |
|---|
$ PIPE RUN TEST | SORT/SPECIFICATION=TEST.SRT - _$ SYS$INPUT SYS$OUTPUT | DIFF SYS$INPUT TEST.BENCHMARK |
この例は,1 つのコマンドでパイプライン機能を使用して,不要な中間ファイルを生成せずにテストを実行し,結果をソートし,結果をベンチマーク・ファイルと比較します。
| #3 |
|---|
$ PIPE (SET DEF WRK$:[WORK] ; RUN REPORT ) | MAIL SYS$INPUT SMITH |
この例は,パイプラインで,サブシェルをパイプ・セグメント・コマンドとして指定する 1 つの方法を示しています。
| #4 |
|---|
$ more :== TYPE/PAGE=SAVE SYS$INPUT
$ PIPE ANA/RMS PAGE.TXT | more
Check RMS File Integrity 26-DEC-2001 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-2001 16:08:50.05
Revision Date: 26-NOV-2001 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
|
この例は,パイプラインの中で/PAGE修飾子を使用する方法を示しています。 /PAGE 機能は,他の多数のDCLコマンドにも存在し,同じように PIPE コマンドと組み合せて使用して他の有用なツールを作ることができます。
| #5 |
|---|
$ ! 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 next stage of the pipeline $ WRITE tee_file LINE ! Log output to the log file $ GOTO LOOP $ EXIT: $ CLOSE tee_file $ EXIT |
これは,パイプライン DCL アプリケーション TEE.COM の例です。
TEE.COM を使用する PIPE コマンドは次のように指定することができます。
$ PIPE SHOW SYSTEM | @TEE showsys.log | SEARCH SYS$INPUT LEF
コマンド・プロシージャ TEE.COM は,パイプラインを通じて送信されるデータのログを記録するために使用されています。これは,SYS$INPUT ではなく SYS$PIPE からのデータを読み込ます。
| #6 |
|---|
$ 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:
$ :
|
この例は,シンボル定義を持つ複数のコマンドを使用して,コマンド・プロシージャに有用なツールを作成する 2 つの簡単な方法を示しています。
| #7 |
|---|
$ PIPE cc foo.c && link foo, sys$library:vaxcrtl.olb/lib |
コンパイルでエラーが発生しない場合,オブジェクト・ファイルは実行可能イメージを生成するためにリンクされます。コンパイル・エラーが発生すると,リンク・ステップはスキップされます。
| #8 |
|---|
$ $ PIPE RUN COLLECT_DATA.EXE || GOTO CLEAN_UP $ : $ : $ EXIT $ $ CLEAN_UP: $ : $ : |
条件付きコマンド実行を使用すると,コマンド・プロシージャの中に単純なエラー処理制御フローを簡単に設定できます。 COLLECT_DATA イメージが失敗すると,制御が CLEAN_UP に移ります。
| #9 |
|---|
$ PIPE COPY LARGE_FILE.DAT REMOTE"user password"::[DESTINATION]*.* & |
この PIPE コマンドは,大型ファイルのコピーを処理するバックグラウンド・プロセスを作成します。
| #10 |
|---|
$ PIPE (SET DEF [.DATA_DIR] ; BACKUP DATA.SAV/SAV [...]) ; RUN FOO |
サブシェル・コマンド・シーケンスは,サブプロセスで実行されます。つまり,プロセス固有特性 (たとえば,省略時のディレクトリ) を変更しても,サブシェルの終了後,現在のプロセスに影響しません。この例では,プログラムFOOを実行するのに必要なデータを提供するため,セーブ・セットがザブディレクトリに復元されます。
| 前へ | 次へ | 目次 | 索引 |