teeを含むあるコマンドの出力を標準出力に取り込み、それを別のコマンドにパイプするにはどうすればよいですか?

teeを含むあるコマンドの出力を標準出力に取り込み、それを別のコマンドにパイプするにはどうすればよいですか?

冗長である可能性があり、まだ答えが見つかりませんでしたが、1つのコマンドを複数の出力にパイプするにはどうすればよいですか(パイプ、標準出力、またはコマンドの代替として送信するなど)。

私は次の行を持っています:

$ command_with_output1 | tee >(command_with_output2) | command3

command_with_output1出力をviaからstdoutviaからviateeからviaからviacommand_with_output2から>()viaからcommand3viaに送信したいです|。可能ですか?この目標を達成する方法は?

無意味な例ですが、私が何を意味するのかを説明するために、次のようになります。

  1. 配管の問題
    $ cat <<< "abc" | tee >( > /dev/null) | while read i; do echo "$i"; done
    

このコマンドは「abc」を2回(1. - tee、2. - while read...)印刷する必要がありますが、実際には一度だけ印刷します。

user@host:~$ cat <<< "abc"| tee >( > /dev/null) | while read i; do echo $i; done
abc #only one, I would expect one more

したがって、2番目の失われた出力はパイプの後で「失われる」と思います(パイプはstdoutからに渡されません)。おそらくパイプなしでファイルでのみ動作するためです(ここで間違っている場合は訂正してください)。 。teestdinwhiletee

  1. 標準出力転送の問題
    cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
    

このコマンドは「after」パイプを使用しませんが、「abc」を2回(もう一度、now)出力したいのですが、一度だけ出力したいとtee思います。teefor i in ...

user@Host:~$ cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
abc #only one, I would expect one more

説明すると、最初のコマンドで私は正しいですか?teeパイプ(ただしファイル)に出力はありません。 2番目のコマンド記述の場合、なぜ2回出力されないのか、コマンドがxargs次に出力を'{}'渡さないのはなぜですか?bash

ベストアンサー1

あなたの説明配管の問題:

より小さな塊に分けてみましょう。

$cat<<<"abc"-->このコマンドは、文字列 "abc"を左のコマンドの標準入力に渡します。

|ティー> ( > /dev/null)-->のティーコマンドはコマンドから入力を受け取ります。標準入力を読み取り、ファイル出力を/ dev / nullにパイプしてから、文字列 "abc"を標準出力に書き込みます。

|私を読むときにecho "$i";-->の読むコマンドは標準入力から文字列「abc」を読み込み、文字列「abc」を変数に格納します。その後、ループは内容を印刷します。これは文字列 "abc"で、一度だけ表示されます。

これティー出力はパイプで接続されるため、このコマンドは端末に何も印刷しません。読む注文する。

標準出力をファイルに書き込むことができます。

user@host:~$ cat <<< "abc"| tee file_name.txt | while read i; do echo $i >> file_name.txt; done; cat file_name.txt

おすすめ記事