パイプするtarですが、-v詳細出力はSTDERRとは別にしてください


12

通常の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(アーカイブデータが流れる場所)に行くことができないため、ファイル名のリストはエラーメッセージと混在しています。

Kornシェルを使用して、アーカイブストリームを別のコマンドにパイプ処理しながら、-vエラーメッセージとは別に出力をキャプチャするコマンドを作成する方法はありますか。


知っていteeますか?これはかなり有効な使用例のようです。
HalosGhost 2015年

回答:


9

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

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

AT&Tの実装ksh(または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か、シェルがプロセス置換に名前付きパイプを使用できない場合は、ここで名前付きパイプを手動で処理する必要があります。


6

そのためには名前付きパイプを使用する必要があります。

まず、フォルダに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別のproccessは()、 、 catgzipnetcatから読み出します。したがって、情報を得るためにstdout / stderrチャネルを失うことはありません。


1
名前付きパイプを使用することの影響に注意する価値があるかもしれません。1)umask 077他のプロセスによる読み取りまたは書き込みを防ぐために(またはプライベート一時ディレクトリを使用して)設定するのが最善です(多くのシステムでは、他のファイルがデフォルトで誰でも読み取り可能なように名前付きパイプが作成されます)、2)確認する必要があります名前付きパイプは、スクリプトの各インスタンスでのみ使用されます(ここでも、一時的なプライベート一時ディレクトリが役立ちます)3)つまり、後でクリーンアップするか、中断された場合にクリーンアップする必要があります。
ステファンChazelas

1
+1-私はこの答えが好きです。私にとって残念なことに、私の(古い)システムの名前付きパイプには、私がこれを試したときにそれらを信頼できないものにする奇妙な点があります。
RedGrittyBrick 2015年

1
@StéphaneChazelas-次のように、最初にクリーンアップする方が簡単な場合がありますp="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
mikeserv

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.