Linux 将stderr和stdout重定向到Bash中的不同文件?

Linux 将stderr和stdout重定向到Bash中的不同文件?,linux,bash,shell,Linux,Bash,Shell,我可以使用以下命令将stdout和stderr重定向到单独的文件: dir >> out 2>> error 或stderror和stdout一起使用以下命令创建一个文件: dir >> consolidate 2>&1 我如何一起做(一次取出、出错、合并文件)?您可以尝试以下方法: (command > >(tee out.txt) 2> >(tee error.txt >&2)) &>

我可以使用以下命令将
stdout
stderr
重定向到单独的文件:

dir >> out 2>> error
stderror
stdout
一起使用以下命令创建一个文件:

dir >> consolidate 2>&1

我如何一起做(一次取出、出错、合并文件)?

您可以尝试以下方法:

(command > >(tee out.txt) 2> >(tee error.txt >&2)) &> consol.txt
测试:

$ ls
f

不需要任何Bashism,因为这可以在标准sh中轻松实现:

{ { dir | tee -a out; } 2>&1 >&3 | tee -a error; } >> consolidate 3>&1

你在说什么?@BroSlow我要找的不止这些。类似于。ls 2>>(tee error | tee-a consolidated)和&1>>(tee out | tee-a consolidated)@J.F.Sebastian:事后连接会丢弃行的相对顺序……不仅仅是“事后”,甚至在运行的管道中稍后重新组合也会丢弃(一些)排序信息。保证stdout和stderr之间的顺序与写调用完全一致,只有当它们都由相同的文件描述符提供服务时,才存在,并且在将它们的输出定向到不同位置时,不能让它们由相同的文件描述符提供服务,即使它们以后重新组合。@williampersell:stderr是无缓冲的,stdout被完全缓冲,然后被重定向。顺序已经丢失了,我想建议使用一个更简单的
{command>(teeout.txt)2>>(teeer.txt);}>两个.txt
,但它不起作用(
teeout.txt
teeer.txt
接收输出),即需要重定向到stderr:
{command>(teeer.txt)2>>(teeer.txt);}&>both.txt
+1--但需要注意的是,与其他所有可用方法一样,除了编写“dir”命令以登录到多个接收器本身之外,这并不能保证正确的顺序。
$ (ls g f > >(tee out.txt) 2> >(tee error.txt >&2)) &> consol.txt
$ cat out.txt
f
$ cat error.txt
ls: cannot access g: No such file or directory
$ cat consol.txt
f
ls: cannot access g: No such file or directory
{ { dir | tee -a out; } 2>&1 >&3 | tee -a error; } >> consolidate 3>&1