gpt4 book ai didi

bash - 在 bash 中将 stderr 复制到另一个文件时重定向 stdout 和 stderr

转载 作者:行者123 更新时间:2023-12-03 01:45:14 25 4
gpt4 key购买 nike

我正在尝试重定向一些 bash 脚本输出。我想做的是:

./some_script.sh 2> error.log >> all_output.log 2>&1

我想将 stderr 放在一个文件中,并将 stderr 和 stdout 放在另一个文件中。

此外,我想附加在 all_output.log 的末尾(对于 error.log 来说并不重要)。

但是我没有得到正确的语法,我已经尝试了很多事情,但无法找到正确的做法。

感谢您的帮助! :)

最佳答案

重定向语句(如 > foo2> bar1>&2)最好像对文件描述符的赋值一样读取,从左到右。您的代码执行以下操作:

2> error.log

含义:fd2 = open_for_writing('error.log')

>> all_output.log

含义:fd1 = open_for_appending('all_output.log')

2>&1

表示:fd2 = fd1

由此您可以了解到,除了可能创建(空)error.log 之外,第一条语句 (2> error.log) 不会产生任何效果。

您想要实现的是将一个流复制到两个不同的目标中。这不是通过简单的重定向就能完成的。为此,您需要一个读取一个内容并将其写入两个不同流的进程。最好使用 tee(1) 来完成。

不幸的是,将流传递到其他进程是通过管道完成的,它们只传递 stdout,而不传递 stderr。为了实现你的目标,你必须首先交换 stderr 和 stdout。

完整的调用结果可能如下所示:

(./some_script.sh 3>&2 2>&1 1>&3 | tee error.log) >> all_outputlog 2>&1

关于bash - 在 bash 中将 stderr 复制到另一个文件时重定向 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45232977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com