如何将标准输出重定向到多个日志文件?以下不起作用:
some_command 1> output_log_1 output_log_2 2>&1
答案1
看man tee
:
名称:tee - 从标准输入读取并写入标准输出和文件
概要: T 恤 [选项]...[文件]...
因此:
echo test | tee file1 file2 file3
答案2
这是一个旧帖子,但我现在才发现......
> /dev/null
您可以将其重定向到最后一个文件,而不是将输出重定向到:
echo "foobarbaz" | tee file1 > file2
或者附加输出:
echo "foobarbaz" | tee -a file1 >> file2
答案3
假设您的输出是由函数生成的cmd()
:
cmd() {
echo hello world!
}
要将输出重定向cmd
到两个文件,但不重定向到控制台,您可以使用:
cmd | tee file1 file2 >/dev/null
如果有任何数据源管道连接到 tee,这将适用于多个文件:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
这也将起作用:
echo $(cmd) | tee file1 file2 >/dev/null
如果没有/dev/null
重定向,tee 会将输出发送到 stdout此外到指定的文件。
例如,如果从控制台运行,您将在那里看到输出。从 crontab 运行,输出将显示邮寄给您的状态消息(另请参阅 Gilles 的回答此处https://unix.stackexchange.com/a/100833/3998)。
这在 Ubuntu 12.04 上的 bash 中对我有用,并且已使用 GNU bash 4.3.11(1) 在 Ubuntu 14.04 中进行了验证,因此它应该适用于任何最新的 GNU bash 版本。
答案4
正如 @jofel 在答案下的评论中提到的,这可以在本地完成zsh
:
echo foobar >file1 >file2 >file3
或者,使用大括号扩展:
echo foobar >file{1..3}
tee
在内部,这与上面提供的答案非常相似。 shell 将命令的标准输出连接到一个通过管道传输到多个文件的进程;因此,这样做没有任何令人信服的技术优势(但它做看起来真的不错)。看手册zsh
了解更多。