
次のコマンドはどのように機能しますか?
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
2つのコマンドを束ねているようです。stdout
上記の例では、進行状況バーはリアルタイムで更新されるため、そうではありません。
答え1
pv
進行状況バーは標準エラーに記録される機能です。pv
マニュアルから:
pvは、経過時間、完了率(進行状況バーを含む)、現在のスループット、送信された合計データ、到着予定時刻などの情報を提供し、パイプラインを介したデータの進行状況を表示します。
これを使用するには、2つのプロセス間のパイプに挿入し、適切なオプションを使用します。標準入力は標準出力に渡され、進行状況は標準エラーに表示されます。
しかし、標準出力と標準エラーのリダイレクト中にTTYへの書き込みに問題はありません。
$ ( echo "out"; echo "error" >&2; echo "hi there" >$(tty) ) 2>&1 | cat >file
hi there
$ cat file
out
error
さらに、O_WRONLY
andO_RDONLY
は名詞ではなく形容詞です。標準出力は書き込み専用で、標準入力は読み取り専用です。