Tシャツとひもを使ったクラフト代替品

Tシャツとひもを使ったクラフト代替品

他の2つのコマンドの出力を介してコマンドをパイプし、2つのプロセス置換結果をマージしようとしています。私を近づけた例は次のとおりです。

command | tee >(sed -rn 's/.*foo (bar).*/1/p') >(awk '{print $3}')

しかし、私は次の目標を達成したいと思います。

  • 元のコマンドの入力ストリームを見る必要はありません。
  • 「貼り付け」を使って結果をマージしたいです。

1つのオプションは、2つの別々のコマンドを実行してファイルに保存することですが、必要なほどエレガントではありません。 Bashでこれを行う最もエレガントな(1行、明確に理解されている)方法は何ですか?

ベストアンサー1

元のコマンドの出力が表示される理由は、指定されたファイルだけでなくtee出力によるものです。stdoutこれを中止するには、この出力をコマンドの最後に入れるか、追加を追加して、>/dev/nullこの出力をプロセス交換の1つにリダイレクトできます>。たとえば、次のようになります。

command | tee >(sed -rn 's/.*foo (bar).*/1/p') > >(awk '{print $3}')

あるいは、より簡単に別のパイプを使用するだけです。

command | tee >(sed -rn 's/.*foo (bar).*/1/p') | awk '{print $3}'

結合された2つのプロセス置換を使用した結果については、paste私が知らないあいまいなシェルトリックがない限り、名前付きパイプを使用せずにこれを行う方法はありません。最終的にこれは2つです(明確さを高めるためにフォーマットされています)。

mkfifo /tmp/myfifo
command |
  tee >(sed -rn 's/.*foo (bar).*/1/p' >/tmp/myfifo) |
  awk '{print $3}' |
  paste /tmp/myfifo -

これをスクリプトに入れる場合は、一時的な名前付きパイプを作成するように提案を使用することも検討できます。ここ

おすすめ記事