一般的な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に巧妙に書き込みます。
-v
Kornシェルを使用すると、アーカイブを別のコマンドにストリーミングしますが、エラーメッセージとは別に出力をキャプチャするコマンドを作成する方法はありますか?
答え1
システムが以下をサポートしている場合/dev/fd/n
:
tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S
ksh
AT&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情報チャネルは失われません。gzip
netcat
答え3
GNU タール--index-file
オプション良い結果:
tar cvf - ./foo 2>foo.err --index-file=foo.out | squish > foo.tar.S