在 Linux 中,我们可以将 stdout 和 stderr 或两者都重定向到文件。例如:
- 将 stdout 和 stderr 重定向到两个文件:
command 1>out 2>err
.通过这种方式,我们可以将输出和错误分离在两个不同的文件中。 - 将 stdout 和 stderr 重定向到文件:
command &>all
.通过这种方式,我们可以捕获输出和错误消息的出现顺序。
我想结合上面的两个命令:command 1>out 2>err &>all
,捕获输出和错误的出现顺序,并将输出和错误分开。但上面的命令不起作用,out
和err
文件都是空的。如果我颠倒顺序,该all
文件将为空。那么,有没有办法按照我的意愿将上面的两个命令组合起来?
答案1
其中bash
有点棘手:
command 2> >(tee err) 1> >(tee out) | tee >all
这里我们需要流程替代 >(...)
并tee
解决该问题。通过进程替换,tee
进程被附加到相应的通道。tee
然后将这些行写入文件中和然后打印到STDOUT
.因此,写入文件后,STDERR
和都STDOUT
将被打印到STDOUT
.在 中bash
,我们不能在一个命令中使用同一通道的多个重定向。这就是为什么我们需要再次通过管道传输输出tee
,然后打印它。
内(注意必须设置zsh
该选项,该选项在 中是默认的):MULTIOS
zsh
command >out 2>err &>all