Bash 创建tarball,动态加密,并将tar消息保存在日志文件中

Bash 创建tarball,动态加密,并将tar消息保存在日志文件中,bash,shell,tar,gnupg,tee,Bash,Shell,Tar,Gnupg,Tee,在OSX上,我试图创建一个目录的tarball,并进行动态加密 它与gpg一起使用,并将tar消息的输出保存在日志文件中,以便 稍后的分析 而tar+gpg在飞行中非常容易 tar zcvf - foo | gpg -e -r foo@bar.com -o foo.tgz.gpg 到目前为止,我无法记录tar的输出(可能还有其中的gpg) 案例)添加到日志文件 我尝试了几种不同的组合 tar | gpg | tee tar | gpg 2>&1 >(tee) tar | g

在OSX上,我试图创建一个目录的tarball,并进行动态加密 它与gpg一起使用,并将tar消息的输出保存在日志文件中,以便 稍后的分析

而tar+gpg在飞行中非常容易

tar zcvf - foo | gpg -e -r foo@bar.com -o foo.tgz.gpg
到目前为止,我无法记录tar的输出(可能还有其中的gpg) 案例)添加到日志文件

我尝试了几种不同的组合

tar | gpg | tee
tar | gpg 2>&1 >(tee)
tar | gpg > file.log
有人帮忙吗

干杯
Davide

2>file.log应该可以实现它。
如果您想
tee
stderr
并将其保持在原始目的地,您可以使用

2>>(tee file.log>&2)

在您的示例中:

tar zcvf - foo 2> >(tee file.log >&2) | gpg -e -r foo@bar.com -o foo.tgz.gpg
您的尝试没有成功,因为管道(|)仅将上一个命令的
stdout
转发到当前命令的
stdin
。当前命令(gpg)无权访问上一个命令(
tar
)的
stderr
)。该
stderr
已到达其目的地(很可能是您的终端)


2>>(command)
管道(确切地说是
>()
在下面创建一个未命名的操作系统级管道)
stderr
命令的
stdin
。由于
command
是一个子进程,因此它的
stderr
(#2)描述符将指向与父进程的
stderr
相同的文件。

问题在于,当在行尾使用2>时,只重定向第二个命令(gpg)stderr。如果您想要(看起来)重定向tar命令stderr,您应该在管道之前添加2>logfile,如下所示:

tar zcvf - foo 2> tar.log | gpg -e -r foo@bar.com -o foo.tgz.gpg