tar をパイプに転送しますが、STDERR から -v 詳細出力を切り離します。

tar をパイプに転送しますが、STDERR から -v 詳細出力を切り離します。

一般的なtarコマンド

tar cvf foo.tar ./foo >foo.out 2>foo.err

3つの出力IOストリームがあります。

  • foo.tarにデータをアーカイブ
  • STDOUTのファイル名のリスト(foo.outにリダイレクト)
  • STDERRに送信されたエラーメッセージ(foo.errにリダイレクト)

その後、ファイル名のリストを読むことなく、foo.errでエラーメッセージを確認できます。

アーカイブされたデータ(netcatまたは特別な圧縮プログラムを介して接続)を実行するには、tarの -f -オプションを使用できます。

tar cvf - ./foo 2>foo.err | squish > foo.tar.S

しかし、今私のファイル名のリストはエラーメッセージと混在しています。 tarの-v出力は明らかにSTDOUT(アーカイブデータが流れている場所)に行くことができないため、tarはSTDERRに巧妙に書き込みます。

-vKornシェルを使用すると、アーカイブを別のコマンドにストリーミングしますが、エラーメッセージとは別に出力をキャプチャするコマンドを作成する方法はありますか?

答え1

システムが以下をサポートしている場合/dev/fd/n:

tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S

kshAT&Tで(またはbash)を実装するには、zsh次のものを使用できます。プロセスの交換:

tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err

これは基本的に同じことを行いますが、今回はシェルが使用するファイル記述子3(通常9以上)を決定します。もう1つの違いは、今回ではなくtar終了状態を取得することですsquish。サポートされていないシステムでは、/dev/fd/n一部のシェルはこの機能を達成するために名前付きパイプに依存している可能性があります。

システムがそれをサポートしていない/dev/fd/n場合、またはシェルがプロセス置換のために名前付きパイプを使用できない場合は、次のことを行う必要があります。名前付きパイプを手動で処理

答え2

これを行うには、名前付きパイプを使用する必要があります。

まず、フォルダに1つを作成します。

mkfifo foo.pipe

次に、次のコマンドを使用します。

tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar

気づく:-section は、パイプから読み取ることができるものにすることがcatできます。gzip

tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar

説明する:

出力は名前付きパイプ(foo.pipe)に書き込まれ、他のプロセス(、、、cat)はここで読み取られます。したがって、stdout / stderr情報チャネルは失われません。gzipnetcat

答え3

GNU タール--index-fileオプション良い結果:

tar cvf - ./foo 2>foo.err --index-file=foo.out | squish > foo.tar.S

関連情報