あるプロセスから別のプロセスにデータをパイプするシェルスクリプトを実行しています
process_a | process_b
2つのプログラム間で渡されたバイト数を確認する方法を知っている人はいますか?現在考えられる唯一の解決策は、stdinから読み取り、stdoutに書き込み、転送されたすべてのデータをカウントし、環境変数にカウントを保存する小さなcプログラムを書くことです:
process_a | count_bytes | process_b
誰かがきちんとした解決策を持っていますか?
Ddにパイプします。 ddのデフォルトの入力はstdinで、デフォルトの出力はstdoutです。 stdin/stdout I/Oが完了すると、転送したデータ量がstderrに報告されます。
Ddの出力をキャプチャする必要があり、他のプログラムがすでにstderrと通信する場合は、別のファイル記述子を使用します。例えば、
$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-
pv パイプビューアを使用します。それは素晴らしいツールです。それについて知ったら、それなしでどのように生活していたかは決してわかりません。
また、進行状況バーと転送の「速度」も表示できます。
process_a | tee >(process_b) | wc --bytes
が機能する可能性があります。その後、wc
のカウントを必要な場所にリダイレクトできます。 _process_b
_がstdout
/stderr
に何かを出力する場合、_/dev/null
_の場合のみ、おそらくこれをどこかにリダイレクトする必要があります。
少し工夫された例の場合:
_filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295
_
説明として:tee
を使用すると、出力を複数のファイル(およびstdout)に送ることができます。>()
構成は、プロセスを書き込み専用ファイルのように見えるbashの「プロセス置換」です。この場合、ファイルだけでなくプロセスにもリダイレクトできます(tee
を使用して出力を送信する例については、 ここ または この質問+回答 を参照してください多くのプロセス)。
私はパーティーに遅れていることはわかっていますが、この便利なスレッドを強化できる良い答えがあると思います。
これは@Phil Pと@David Spillettの回答の組み合わせですが、
バイト数は、process_bの出力とともにstdoutに出力されます。
出力を処理するときに、プレフィックスを使用してバイトを含む行を識別できます(Bytes:
の例)。
exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-
警告:
出力の行の順序に依存しないでください
順序は予測不可能であり、同じパラメータで同じスクリプトを呼び出す場合でも、順序は常に異なる場合があります。