web-dev-qa-db-ja.com

pvはどのように機能しますか?

次のコマンドはどのように機能しますか?

pv file.tar.gz | tar -xz

私の理解では、パイプ演算子|pipeを作成し、stdoutpvはパイプのO_WRONLY端にマップされ、tarstdinO_RDONLYにマップされ、O_WRONLYO_RDONLYの両方がpipefsに存在します。

これはすべてうまくいっていますが、以下が私の画面に印刷されています。

31.1MiB 0:00:05 [6.17MiB/s] [===================================>] 100%

私の知る限り、このプログレスバーはtarによって生成されません。オプションがあればオプションで利用でき、pvは必要ないため、pvです。それを生成する必要があります。しかし、どのように? pvstdoutO_WRONLYにマップされます。

また、一部のシェルはpipefsの代わりにパイプにソケットペアを使用し、ソケットペアは双方向であることも読みました。しかし、それは、一方または両方が完了するまで、両方のコマンドのstdinstdoutを拘束するように思えます。プログレスバーはリアルタイムで更新されるため、上記の例ではそうではありません。

1

プログレスバーはpvの機能であり、標準エラーで記述されています。 pvマニュアルから:

pvは、経過時間、完了率(進行状況バー付き)、現在のスループットレート、転送されたデータの合計、ETAなどの情報を提供することにより、パイプラインを介したデータの進行状況を示します。

これを使用するには、適切なオプションを使用して、2つのプロセス間のパイプラインに挿入します。その標準入力はその標準出力に渡され、進行状況は標準エラーで表示されます。

ただし、標準出力と標準エラーの両方をリダイレクトすると同時に、TTYへの書き込みに問題はありません。

$ ( echo "out"; echo "error" >&2; echo "hi there" >$(tty) ) 2>&1 | cat >file
hi there

$ cat file
out
error

また、O_WRONLYおよびO_RDONLYは名詞ではなく、形容詞です。標準出力は書き込み専用で、標準入力は読み取り専用です。

8
Kusalananda