我正在 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。
答案1
的输出tar cvf -
是存档。通过指定-
为 的参数f
,您将告诉tar
在 stdout 上输出存档(在这种情况下,因为|gzip
,tar
的 stdout 是到 的管道gzip
)。
v
您要求的 erbose 输出(文件列表)会像v
错误消息一样出现在 stderr 上,因为它不能像进入gzip
文件一样出现在 stdout 上tar.gz
。另请注意,您的唯一2> error.log
重定向。gzip
stderr
如果您不需要详细的文件列表(我假设您的意思是输出),然后省略v
.stderr
如果您希望所有cd
,tar
和gzip
(以及 shell 打开输出文件)的错误消息都转到日志文件,请重定向子 shell 或命令组:
(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
仍然引用管道gzip
(因为我们已经在将3>&1
stdout 重定向到 之前将文件描述符 3 重定向到它(使用 )../file.list
),但由于我们不再告诉tar
在其 stdout 上发送存档,因此tar
是免费的将文件列表写入标准输出(我们重定向到../file.list
)。