通常のtarコマンド
tar cvf foo.tar ./foo >foo.out 2>foo.err
3つの出力IOストリーム
次に、ファイル名のリストを読む必要なく、エラーメッセージについてfoo.errを検査できます。
アーカイブデータで何かをしたい場合(netcatまたは特別な圧縮プログラムを介してそれをパイプします)、tarの-f -
オプションを使用できます。
tar cvf - ./foo 2>foo.err | squish > foo.tar.S
ただし、tarの-v
出力は明らかにSTDOUT(アーカイブデータが流れる場所)に移動できないため、tarはSTDERRに巧妙にSTDERRに書き込みます。
Kornシェルを使用して、アーカイブストリームを別のコマンドにパイプ処理しながら、-v
出力をエラーメッセージとは別にキャプチャするコマンドを作成する方法はありますか。
システムが/dev/fd/n
をサポートしている場合:
tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S
ksh
(またはbash
またはzsh
)のAT&T実装では、プロセス置換を使用して記述できます。
tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err
今回は、シェルが3
(通常は9以上)の代わりに使用するファイル記述子を決定することを除いて、まったく同じことを行っています。別の違いは、今回はtar
ではなくsquish
の終了ステータスを取得することです。 /dev/fd/n
をサポートしないシステムでは、一部のシェルがその機能のために名前付きパイプを使用する場合があります。
システムが/dev/fd/n
をサポートしていない場合、またはシェルがプロセス置換に名前付きパイプを使用できない場合は、ここで 名前付きパイプを手動で処理する にする必要があります。
そのためには名前付きパイプを使用する必要があります。
まず、フォルダに1つ作成します。
mkfifo foo.pipe
次に、そのコマンドを使用します。
tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar
通知:cat
- partは、パイプから読み取ることができるgzip
または何でもかまいません。
tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar
説明:
出力は名前パイプ(foo.pipe
)、別のプロセス(cat
、gzip
、netcat
)がそこから読み取ります。したがって、情報を得るためにstdout/stderrチャネルを失うことはありません。
GNU tar --index-file
オプション はうまく機能します:
tar cvf - ./foo 2>foo.err --index-file=foo.out | squish > foo.tar.S