出力をリダイレクトするために以下のコマンドを使用して、Solarisでtar.gzファイルを作成しています。
cd /ebs/datatop && tar cvf - * | gzip -c > /ebs/backup/proddata.tar.gz >> /dev/null 2>> error.log
実行されると、空のファイルとして/ebs/backup/proddata.tar.gz
が作成されます。エラーは発生しません。 tarファイルが/dev/null
にリダイレクトされていると想定しています。コマンド出力のみを/dev/null
にリダイレクトし、エラーをerror.logに書き込みます。
tar cvf -
の出力はアーカイブです。 f
の引数として-
を指定することで、tar
にアーカイブをstdoutに出力するように指示します(その場合、|gzip
のため、tar
のstdoutはgzip
へのパイプになります)。
v
を使用してtar.gz
ファイルに移動するとstdoutを実行できないため、v
で要求したgzip
erbose出力(ファイルのリスト)はstderrに出力されます。また、2> error.log
はgzip
のstderr
のみをリダイレクトすることに注意してください。
詳細なファイルリスト(つまり、outputとはどういう意味かと思います)が必要ない場合は、v
を省略します。また、stderr
、cd
、tar
のすべてのエラーメッセージ(およびシェルによる出力ファイルのオープン)をログファイルに移動する場合は、サブシェルまたはコマンドグループのgzip
をリダイレクトします。
(cd /ebs/datatop &&
tar cf - . | gzip > /ebs/backup/proddata.tar.gz) 2>> error.log
また、現在のディレクトリをアーカイブするために、*
を.
に置き換えました。 *
は非表示でないファイルにのみ展開され、一部のファイル名で問題が発生します。
error.log
は、そのcd
より前の現在の作業ディレクトリに格納されます。あなたのアプローチでは、そのerror.log
はtar.gz
ファイルに格納されることになります。
そのファイルリスト(v
またはvv
)をあるファイルにリダイレクトし、エラーを他のファイルにリダイレクトしたい場合は、-
以外の引数をf
フラグに使用する必要があります。たとえば、/dev/fd/n
をサポートするシステムでこの構文を使用すると、次のようになります。
(tar cvvf /dev/fd/3 . 3>&1 > ../file.list | gzip > ../file.tar.gz) 2> ../error.log
上記では、/dev/fd/3
は__stdoutを3>&1
にリダイレクトする前に(../file.list
を使用して)ファイル記述子3をそこにリダイレクトするため、gzip
へのパイプを引き続き参照しますが、 st_outでアーカイブを送信するようにtar
に指示しなくなりました。tar
はstdout(../file.list
にリダイレクトします)にファイルリストを自由に書き込むことができます。