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

Gir*_*ara 2 shell pipe io-redirection

我正在使用以下命令在 Solaris 中创建一个 tar.gz 文件来重定向输出。

cd /ebs/datatop && tar cvf - * | gzip -c > /ebs/backup/proddata.tar.gz >> /dev/null 2>> error.log
Run Code Online (Sandbox Code Playgroud)

执行时,它创建/ebs/backup/proddata.tar.gz为一个空文件。不给出任何错误。我假设 tar 文件被重定向到/dev/null. 我只想将命令输出重定向/dev/null到 error.log 并将错误写入。

Sté*_*las 7

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

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

如果您不想要冗长的文件列表(我假设您的意思是output),那么只需省略v. stderr如果您希望所有cd,targzip(以及外壳程序打开输出文件)的错误消息转到日志文件,请重定向子外壳程序或命令组:

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

我也取代*.归档当前目录。*只会扩展到非隐藏文件,并且会导致某些文件名出现问题。

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
Run Code Online (Sandbox Code Playgroud)

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