
冗長である可能性があり、まだ答えが見つかりませんでしたが、1つのコマンドを複数の出力にパイプするにはどうすればよいですか(パイプ、標準出力、またはコマンドの代替として送信するなど)。
私は次の行を持っています:
$ command_with_output1 | tee >(command_with_output2) | command3
command_with_output1
出力をviaからstdout
viaからviatee
からviaからviacommand_with_output2
から>()
viaからcommand3
viaに送信したいです|
。可能ですか?この目標を達成する方法は?
無意味な例ですが、私が何を意味するのかを説明するために、次のようになります。
- 配管の問題
$ 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
からに渡されません)。おそらくパイプなしでファイルでのみ動作するためです(ここで間違っている場合は訂正してください)。 。tee
stdin
while
tee
- 標準出力転送の問題
cat <<< "abc" | tee >(xargs -I{} bash -c "for i in '{}'; do echo $i; done")
このコマンドは「after」パイプを使用しませんが、「abc」を2回(もう一度、now)出力したいのですが、一度だけ出力したいとtee
思います。tee
for 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