作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试重定向一些 bash 脚本输出。我想做的是:
./some_script.sh 2> error.log >> all_output.log 2>&1
我想将 stderr 放在一个文件中,并将 stderr 和 stdout 放在另一个文件中。
此外,我想附加在 all_output.log 的末尾(对于 error.log 来说并不重要)。
但是我没有得到正确的语法,我已经尝试了很多事情,但无法找到正确的做法。
感谢您的帮助! :)
最佳答案
重定向语句(如 > foo
或 2> bar
或 1>&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/
我是一名优秀的程序员,十分优秀!