在 Solaris 中创建 tar 时如何将输出重定向到文件?

在 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/nullerror.log,并将错误写入 error.log。

答案1

的输出tar cvf -是存档。通过指定-为 的参数f,您将告诉tar在 stdout 上输出存档(在这种情况下,因为|gzip,tar的 stdout 是到 的管道gzip)。

v您要求的 erbose 输出(文件列表)会像v错误消息一样出现在 stderr 上,因为它不能像进入gzip文件一样出现在 stdout 上tar.gz。另请注意,您的唯一2> error.log重定向。gzipstderr

如果您不需要详细的文件列表(我假设您的意思是输出),然后省略v.stderr如果您希望所有cd,targzip(以及 shell 打开输出文件)的错误消息都转到日志文件,请重定向子 shell 或命令组:

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

我还替换*.存档当前目录。*只会扩展到非隐藏文件,并且会导致某些文件名出现问题。

error.log之前的文件将存储在当前工作目录中cd。按照您的方法,这error.log最终会存储在tar.gz文件中。

如果您想将该文件列表(使用vvv)重定向到某个文件,并将错误重定向到其他文件,则需要使用除标志之外的-参数f。例如,在支持以下功能的系统上使用此语法/dev/fd/n

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

上面,/dev/fd/3仍然引用管道gzip(因为我们已经在将3>&1stdout 重定向到 之前将文件描述符 3 重定向到它(使用 )../file.list),但由于我们不再告诉tar在其 stdout 上发送存档,因此tar是免费的将文件列表写入标准输出(我们重定向到../file.list)。

相关内容