在 Solaris 中創建 tar 時如何將輸出重定向到文件?
我正在使用以下命令在 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並將錯誤寫入error.log。
的輸出
tar cvf -
是存檔。通過指定-
為 的參數f
,您將tar
在標準輸出上輸出存檔(在這種情況下,由於 ,|gzip
的tar
標準輸出是 的管道gzip
)。您要求的
v
erbose 輸出(文件列表)v
會像錯誤消息一樣出現在 stderr 上,因為它不能在 stdout 上繼續,因為它會進入文件gzip
並進入tar.gz
文件。另請注意,您唯一的2> error.log
重定向.gzip``stderr
如果您不想要詳細的文件列表(我假設您的意思是output),那麼只需省略
v
. 如果您希望所有的stderr
錯誤消息和(以及 shell 對輸出文件的打開)轉到日誌文件,則重定向子 shell 或命令組: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
orvv
)重定向到某個文件,並將錯誤重定向到某個其他文件,則需要使用標誌以外-
的參數。f
例如,在支持的系統上使用此語法/dev/fd/n
:(tar cvvf /dev/fd/3 . 3>&1 > ../file.list | gzip > ../file.tar.gz) 2> ../error.log
上面,
/dev/fd/3
仍然指的是管道(因為在將 stdout 重定向到 之前gzip
,我們已經處理了將文件描述符 3 重定向到它(使用) ),但是因為我們不再告訴在其 stdout 上發送存檔,所以是免費的將文件列表寫入標準輸出(我們重定向到)。3>&1``../file.list``tar``tar``../file.list