Solarisでtarを作成するときに出力をファイルにリダイレクトする方法は?

Solarisでtarを作成するときに出力をファイルにリダイレクトする方法は?

出力をリダイレクトするtar.gzファイルを生成するために、Solarisは次のコマンドを使用しています。

cd /ebs/datatop && tar cvf - * | gzip -c > /ebs/backup/proddata.tar.gz >> /dev/null 2>> error.log

実行すると、空の/ebs/backup/proddata.tar.gzファイルが生成されます。どのエラーも発生しません。 tarファイルがにリダイレクトされているとします。コマンド出力がerror.logにリダイレクトされ、エラーがerror.logに書き込まれることを/dev/null望みます。/dev/null

答え1

出力はtar cvf -アーカイブです。-引数をとして指定すると、出力アーカイブがstdoutになるように指示するfことになりますtar(この場合は|gzipstdoutがへtarのパイプであるためgzip)。

v要求された詳細出力(ファイルリスト)は、vエラーメッセージのようにstderrに表示されます。なぜなら、gzipstdoutにfileに入るのと同じ方法で現れないからですtar.gz。また、唯一の2> error.logリダイレクトがあることに注意してください。gzipstderr

詳細なファイルリストが必要ない場合(私の考えでは出力)、vおよびに関するstderrすべてのエラーメッセージ(およびシェルで開かれた出力ファイル)をログファイルに移動するには、サブシェルまたはコマンドグループをリダイレクトします。cdtargzip

(cd /ebs/datatop &&
   tar cf - . | gzip > /ebs/backup/proddata.tar.gz) 2>> error.log

また、現在のディレクトリをアーカイブ*に置き換えました。隠しファイルではなくファイルにのみ拡張され、一部のファイル名に問題が発生します。.*

error.log古いファイルは現在の作業ディレクトリに保存されますcd。あなたのアプローチに応じて、これは最終的にファイルerror.logに保存されます。tar.gz

vそのファイルのリスト(または使用)を特定のファイルにリダイレクトし、エラーを別のファイルにリダイレクトするには、vvflags以外の-引数を使用する必要がありますf。たとえば、次をサポートするシステムではこの構文を使用します/dev/fd/n

(tar cvvf /dev/fd/3 . 3>&1 > ../file.list | gzip > ../file.tar.gz) 2> ../error.log

上記では、/dev/fd/3パイプはまだ参照されていますがgzip3>&1stdoutをパイプにリダイレクトする前にすでにファイル記述子3をパイプにリダイレクトしているため)、stdoutにアーカイブを送信するように指示しないため、書き込み../file.listファイルを自由にリストできます。標準出力に(にリダイレクト)tartar../file.list

関連情報