在Bash中重定向stdout和stderr,同时将stderr复制到另一个文件

3
我想要重定向一些bash脚本的输出。 我的目标是:
./some_script.sh 2> error.log >> all_output.log 2>&1

我想将 stderr 写入一个文件,同时将 stderr 和 stdout 写入另一个文件。此外,我想在 all_output.log 的末尾追加内容(对于 error.log 来说这不重要)。但是我没有找到正确的语法,我已经尝试了很多方法,但是我无法找到正确的解决方法。谢谢您的帮助! :)
1个回答

2
重定向语句(如> foo2> bar1>&2)最好像对文件描述符的分配一样从左到右执行。您的代码执行如下:
2> error.log

意思是:fd2 = open_for_writing('error.log')

>> all_output.log

Means: fd1 = open_for_appending('all_output.log')

2>&1

意思是:fd2 = fd1 通过这个,您可以理解第一个语句(2> error.log)除了可能创建(空的)error.log之外没有任何影响。
您想要实现的是将一个流复制到两个不同的目标。这不仅仅是简单地重定向任何内容。为此,您需要一个读取一件事情并将其写入两个不同流的进程。最好使用tee(1)来完成这项工作。
不幸的是,将流传递给其他进程是通过管道完成的,它们只传递stdout,而不是stderr。为了实现您的目标,您必须先交换stderr和stdout。
完整的调用结果可能如下所示:
(./some_script.sh 3>&2 2>&1 1>&3 | tee error.log) >> all_outputlog 2>&1

1
非常感谢,你让我的一天变得美好!我想这对我来说有点太棘手了。 - Xerock
@Xerock 你毁了我的好名声,原来是22222,现在变成了22237。不过我并不难过;-) - Alfe
1
@Alfe讲解得非常完美,回答太棒了。 - skr
1
@Alfe 抱歉 ^^ 越高越好! - Xerock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接