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