プロセス置換における<(コマンド)と>(コマンド)の違い

プロセス置換における<(コマンド)と>(コマンド)の違い

存在するプロセスの交換2つの構文を見ることができます。

>(command_list)

そして

<(command_list)

私はしばしば2番目の構文を使用します。ところで、2つの違いが何であるかわかりませんか?検索した結果、特別な結果は出ませんでした。

答え1

使用する:

consumer <(feeder)

~のため出力ofはstdinから入力を取得できない場合(この場合は使用する)feederに供給されますが、引数として指定されたファイル名からのみ入力を取得できます。consumerconsumerfeeder | cousumer

この場合、feeder出力はパイプの書き込みの終わりであり、拡張子は<(feeder)ファイル名(/dev/fd/<x>サポートされていないシステムでは名前付きパイプである可能性がありますが通常)であり、/dev/fd/<n>一度開くと(によって)consumer読むチューブの終わりです。

対称的に以下を使用します。

feeder >(consumer)

feeder出力をstdout(再実行できます)に送信せずにfeeder | consumer名前を引数として渡す必要があるファイルに送信するコマンドの場合。

consumerだから入力するはパイプの読み取り端であり、パイプの書き込み端に達するために>(consumer)開くと(経由で渡された)ファイル名に展開されます。feeder

<(...)次のように複数の入力が必要なコマンドに役立つため、より一般的に使用されます。

diff -u <(cmd1) <(cmd2)

コマンドが複数の出力を生成したり、コマンドが出力をstdoutに送信できない場合は一般的ではありません。一般的な例外は次のとおりです。

feeder | tee >(consumer1) >(consumer2) | consumer3

その中には、teeいくつかの出力を複数のファイル(stdoutに加えて)に並列に送信する一般的なコマンドがあります。

次のような内容を見たことがあります。

tar cf - somedir |
 gzip -9 |
 tee >(shasum > dir.tgz.shasum) >(md5sum > dir.tgz.md5sum) > dir.tgz

チェックサムを作成して保存しながら、出力gzip(ここでは圧縮されたtarアーカイブ)を出力ファイルに送信します。shasummd5sum

関連情報