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

标签 bash io

我正在尝试重定向一些 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/

相关文章:

python - bash 等同于 os.walk?

PHP 执行() : Running bash script to configure environment then executing Python program

java - 终端无法运行apktool

java - 将文件读取到具有固定缓冲区大小的 byte[] 会生成重复的输出

multithreading - 将 IO::Async 与矢量化 STDIN 一起使用

bash - 在 bash 的算术语句之前什么时候需要美元符号?

macos - Basename 在变量两边加上单引号

java - 如何更改 javaCC adder.jj 以从命令提示符接收字符串而不是流?

io - Win7 上的秃鹰 : connection issue (Errno 10054)

python - Python中的二进制缓冲区