Shell

在 Solaris 中創建 tar 時如何將輸出重定向到文件?

  • May 19, 2020

我正在使用以下命令在 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在標準輸出上輸出存檔(在這種情況下,由於 ,|gziptar標準輸出是 的管道gzip)。

您要求的verbose 輸出(文件列表)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文件中。

如果您想將該文件列表(使用vor 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 重定向到 之前gzip,我們已經處理了將文件描述符 3 重定向到它(使用) ),但是因為我們不再告訴在其 stdout 上發送存檔,所以是免費的將文件列表寫入標準輸出(我們重定向到)。3>&1``../file.list``tar``tar``../file.list

引用自:https://unix.stackexchange.com/questions/362591