次のコマンドはどのように機能しますか?
pv file.tar.gz | tar -xz
私の理解では、パイプ演算子|
はpipe
を作成し、stdout
のpv
はパイプのO_WRONLY
端にマップされ、tar
のstdin
はO_RDONLY
にマップされ、O_WRONLY
とO_RDONLY
の両方がpipefs
に存在します。
これはすべてうまくいっていますが、以下が私の画面に印刷されています。
31.1MiB 0:00:05 [6.17MiB/s] [===================================>] 100%
私の知る限り、このプログレスバーはtar
によって生成されません。オプションがあればオプションで利用でき、pv
は必要ないため、pv
です。それを生成する必要があります。しかし、どのように? pv
のstdout
はO_WRONLY
にマップされます。
また、一部のシェルはpipefs
の代わりにパイプにソケットペアを使用し、ソケットペアは双方向であることも読みました。しかし、それは、一方または両方が完了するまで、両方のコマンドのstdin
とstdout
を拘束するように思えます。プログレスバーはリアルタイムで更新されるため、上記の例ではそうではありません。
プログレスバーは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
は名詞ではなく、形容詞です。標準出力は書き込み専用で、標準入力は読み取り専用です。