日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
PIPE |
同じコマンド行から,1 つまたは複数の DCL コマンド文字列を実行します。 PIPE コマンドを使用すると,コマンド・パイプライン動作,入出力リダイレクト,および条件付きバックグラウンド実行など, UNIX スタイルのコマンド処理を実行できます。
PIPE コマンド・シーケンス [区切り文字 コマンド・シーケンス]...
コマンド・シーケンス
DCL コマンド,パイプライン,またはサブシェルを指定します。
- DCL コマンド
修飾子,パラメータ,キーワード,および値を入れることができるDCLコマンド文字列- パイプライン
パイプラインは,縦線 (|) 区切り文字で表される パイプ で接続されたパイプライン・セグメント・コマンドのシーケンスです。パイプライン・セグメント・コマンドとは,パイプライン内の DCL コマンドです。パイプは,あるパイプライン・セグメント・コマンドの SYS$OUTPUT を,次のパイプライン・セグメント・コマンドの SYS$INPUT に接続します。パイプラインの形式は,次のとおりです。
パイプライン・セグメント・コマンド | パイプライン・セグメント・コマンド [ |...]
- サブシェル
サブシェルは,区切り文字で区切られ,括弧で囲まれた 1 つまたは複数のコマンド・シーケンスです。サブシェルの形式は,次のとおりです。
(コマンド・シーケンス [区切り文字 コマンド・シーケンス]...)
コマンド・シーケンスでは,入出力をリダイレクトできます。山括弧 (>または<) の前にあるコマンドは,実行中,SYS$INPUT,SYS$OUTPUT,または SYS$ERROR を再定義します。 PIPE コマンドでは山括弧が入出力リダイレクト構文と解釈されるため, PIPE コマンドでディレクトリ指定を表すために山括弧 (<>) を使用することはできません。
区切り文字
PIPE コマンドで指定されたコマンド・シーケンスが処理する動作を決定します。有効な PIPE 区切り文字を 表 DCLII-14 に示します。
表 DCLII-14 PIPEコマンドの区切り文字 区切り文字 動作 | 基本的なパイプの区切り文字。パイプは,あるパイプライン・セグメント・コマンドの SYS$OUTPUT を,次のパイプライン・セグメント・コマンドの SYS$INPUT に接続します。 ; 順次実行。セミコロン (;) の後のコマンド・シーケンスは,先行するコマンド・シーケンスの終了後に実行されます。この区切り文字の前には,空白を入れなければなりません。空白を入れないと,レコード管理システム (RMS) ファイル指定のバージョン番号区切り文字として解析されます。 && 条件付き実行 (成功時)。 2 個のアンパサンド (&&) の後のコマンド・シーケンスは,先行するコマンド・シーケンスが成功した場合にだけ実行されます。 || 条件付き実行 (失敗時)。 2 個の縦線 (||) の後のコマンド・シーケンスは,先行するコマンド・シーケンスが失敗した場合にだけ実行されます。 & バックグラウンド実行。アンパサンド (&) に先行するすべてのコマンド・シーケンスが,サブプロセス環境で非同期に実行されます。 &区切り文字は,SPAWN/NOWAIT コマンドに似ています。 注意:スペースをはさまずに文字列に先行するアンパサンドは,バックグラウンド実行構文でなく,従来の DCL シンボル置換式として解析されます。
@TEE コマンド・ファイル TEE.COM。出力を 2 つのターゲットにリダイレクトするために使用されます ( たとえば,1 つの出力をパイプラインの次のコマンドにリダイレクトし,もう 1 つをファイルにリダイレクトする場合など )。 TEE.COM の使用法については,例を参照してください。
PIPE コマンド行では,& が最高優先順位を持ち,"|",";","&&",および "||" が同じ優先順位でそれに続きます。
PIPE コマンドを使用すると,単一のコマンド行で複数の DCL コマンドを実行して, UNIX スタイルのコマンド処理を実行できます。 PIPE コマンドを使用すると,以下の方法で DCL コマンドを実行することができます。
- 複数コマンド実行
複数の DCL コマンドを単一の PIPE コマンドに指定して,順次実行します。複数コマンド実行の構文は,次のとおりです。
PIPE コマンド・シーケンス ; コマンド・シーケンス [; コマンド・シーケンス]...
- 条件付きコマンド実行
コマンド・シーケンスは,先行するコマンド・シーケンスの実行結果に応じて,条件付きで実行されます。
次の形式を使用すると,コマンド・シーケンス 1 が成功した場合のみ,コマンド・シーケンス 2 が実行されます。
PIPE コマンド・シーケンス1 && コマンド・シーケンス2
次の形式を使用すると,コマンド・シーケンス 1 が失敗した場合のみ,コマンド・シーケンス 2 は実行されます。
PIPE コマンド・シーケンス1 || コマンド・シーケンス2
- パイプライン・コマンド実行
パイプラインは,次のように DCL コマンドをパイプで接続して構成されます。
PIPE パイプライン・セグメント・コマンド | パイプライン・セグメント・コマンド [|...]
各パイプライン・セグメント・コマンドは, SYS$OUTPUT を次のパイプライン・セグメント・コマンドの SYS$INPUT に接続し,別々のサブプロセスで実行されます。これらのサブプロセスは,パラレルに実行されます。ただし,最初のパイプライン・セグメント・コマンドを除く各パイプライン・セグメント・コマンドが,その先行パイプライン・セグメント・コマンドの標準出力をその標準入力として読み込むという意味で同期化されます。パイプラインは,最後のパイプライン・セグメント・コマンドが終了すると,実行を終了します。
通常,パイプラインでは,「フィルタ・アプリケーション」を使用します。フィルタ・アプリケーションとは,SYS$INPUT からのデータを取り,特定の方法でデータを変換し,SYS$OUTPUT に書き込むプログラムのことです。- サブシェル実行
次のサブシェル実行形式を使用して,コマンド・シーケンスをサブプロセス環境で実行できます。
PIPE ( コマンド・シーケンス [区切り文字 コマンド・シーケンス]... )
サブシェル内のコマンド・シーケンスは,サブプロセス環境で実行されます。 DCL は,サブシェルが終了してから,次のコマンド・シーケンスを実行します。 ( ) 区切り文字は,SPAWN/WAIT コマンドに似ています。- バックグラウンド実行
コマンド・シーケンスは,次の形式を使用して,サブプロセス環境で実行できます。
PIPE コマンド・シーケンス [ 区切り文字 コマンド・シーケンス]... &
DCL は,コマンド・シーケンスの終了を待ちません。バックグラウンド・サブプロセスが作成されると,制御は DCL に戻ります。- 入出力リダイレクト
コマンド・シーケンスは,次のようにコマンドの実行中に,SYS$INPUT, SYS$OUTPUT,または SYS$ERROR をファイルにリダイレクトできます。
SYS$INPUT をリダイレクトするには,次のように実行します。
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 コマンドは,このコンテキストで動作しないか,新しい動作を示します。次に,そのコマンドを示します。
- PIPE --- 同じコマンド・プロシージャ・レベルでは, PIPE コマンドをネストできません。コマンド・プロシージャ・レベルごとに, 1 つの PIPE コマンド・コンテキストだけが使用できます。ただし,異なるプロシージャ・レベルでは,PIPE コマンドをネストできます。次に例を示します。
$ TYPE FOO.COM $ ! FOO.COM $ : $ PIPE ... $ : $ $ PIPE @FOO.COM ; ...
この例で,FOO.COM の内側にある PIPE コマンドは,異なるコマンド・プロシージャ・レベルで実行されるので使用できます。- GOTO および EXIT --- この 2 つのコマンドは, PIPE コマンド・シーケンスとして実行すると,GOTO または EXIT コマンドが実行される前に PIPE コマンド・コンテキストを削除します。 PIPE コマンドでこの 2 つのコマンドに続くコマンド・シーケンスは,フラッシュされます。
- STOP --- STOP コマンドは, PIPE コマンドを Ctrl/Y で割り込んでから実行すると, PIPE コマンド・コンテキストを削除します。
- THEN,ELSE,ENDIF,SUBROUTINE,ENDSUBROUTINE,RETURN,および DCL ラベル --- これらのコマンドは, PIPE コマンド・コンテキストでその関数を認識できないため, PIPE コマンド・シーケンスとして実行できません。
PIPE コマンドは,実行中に多数のサブプロセスを作成できます。通常,コマンド・シーケンスで起動されるアプリケーションは,プロセスの論理名とシンボル名に依存しません。この場合,/NOLOGICAL_NAMES および /NOSYMBOLS 修飾子を使用すると,サブプロセスを素早く作成できます。この修飾子により,プロセスの論理名とシンボルは, PIPE コマンドで作成されたサブプロセスに渡されなくなります。
DCL のユーザは,DEFINE または ASSIGN コマンドを使用して,SYS$INPUT, SYS$OUTPUT,または SYS$ERROR をリダイレクトできます。このようなリダイレクトは,ユーザ・モード (/USER_MODE 修飾子を使用 ) またはスーパバイザ・モード (/SUPERVISOR_MODE 修飾子を使用 ) のリダイレクトとして実行できます。ユーザ・モード・リダイレクトは,次のユーザ・モード・イメージの環境だけに影響します。
PIPE コマンドでは,リダイレクトは,リダイレクト構文を使用して実行できます。 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 を再定義する場合と同じです。
この節では,パイプラインのコンテキストで一部異なる 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 |
目次 索引
|