'cmd1 | cmd2'と 'cmd2 <(cmd1)'と 'mkfifo cmd1>foo'の違いは何ですか?

'cmd1 | cmd2'と 'cmd2 <(cmd1)'と 'mkfifo cmd1>foo'の違いは何ですか?

または:cmd2が両方を使用でき、単一のコマンドである場合、STDINが優先されないタイミングと理由は何ですか?

私はこのサイトでいくつかの質問を見つけ、3つの答えは上記の各質問の1つでした。これ。この質問に対する最初の答えのバリエーションがありますmkfifo foo; cmd2 foo; cmd2<foo

私にとって、3つの関連する答えはすべて機能的冗長性のように読み取られますが、基本的な意味が少し異なります。これを見るたびに、最後の2つの回答が最初の回答を編集する必要があるのか​​、それとも今まで気づいていなかった本当に重要なことがあるのだろうか。

以下は、「ローカルWiresharkを使用したSSH経由のリモートネットワークデバイスのスニッフィング」に関する具体的な例です。

先入れ先出し方式で、元の回答(1):

$ mkfifo /tmp/remote; wireshark -k -i /tmp/remote
$ ssh remote "tcpdump -s 0 -U -n -w - <moreOpts>" > /tmp/remote

回答(2) with <(...)(プロセス置換):

$ wireshark -k -i <(ssh remote tcpdump -s0 -U -n -w - <moreOpts>)

回答(3)、ベルト|(パイプライン):

$ ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -

私は順番に読むのが簡単だと思うので、一般的にcmd1 | cmd2私のケースのバージョンを選択します。

詳細を掘り下げる理由はありませんでしたが、変数、スコープ、およびサブシェルのバッファリングに関連するいくつかの極端なケースを漠然と覚えています。

それでは、フォーム1、2、または3を使用しないでください極端なケースは何ですか?

(1)の例は、SSHリンクが不安定であればプロセスを独立して再開できることである。ただし、それ以外の場合は、タイプ配管が優先されない場合の厳密で迅速なルールを表示または検索しません。

ベストアンサー1

主な違いは、さまざまなコマンドが実行されるシェルです。とにかく、sshどちらもwireshark外部プロセスなので、どちらを使用しても意味の違いはほとんどありません。

一方または両方のコマンドがシェルコマンドの場合、違いはより重要です。を使用すると、mkfifo両方のコマンドが現在のシェルインスタンス内で実行されます。パイプを使用すると、両方のコマンドが呼び出しシェルによって生成されたサブシェルで実行されます。現在のシェルから開始するには、プロセス置換(<(...))を使用します(サブシェルから)。wiresharkssh

これは、変数の変更が処理される方法に影響を与える可能性があります。考慮する:

  1. x=0; echo foo | { x=1; cat; }; echo "$x"0値を出力しますx
  2. x=0; { x=1; cat; } < <(echo foo); echo "$x"出力値は1です。x

あなたの場合は、プロセスの置き換えなどの非標準の拡張を必要としない単純なパイプを使用します。

ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -

おすすめ記事