如何将输出重定向到多个日志文件

如何将输出重定向到多个日志文件

如何将标准输出重定向到多个日志文件?以下不起作用:

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了解更多。

相关内容