如何在没有管道标准输出的情况下管道stderr


24

如何通过管道传输标准错误流而不通过管道传输标准输出流?

我知道此命令有效,但它也会将标准写出来。

Command 2>&1 | tee -a $LOG

如何获得标准错误?

注意:我想要的只是将stderr流写入日志,并将stderr和stdout都写入控制台。

Answers:


26

为此,请使用一个额外的文件描述符来切换stderr和stdout:

find /var/log 3>&1 1>&2 2>&3 | tee foo.file

基本上,它可以起作用,或者至少我认为它可以起作用,如下所示:
重定向是从左到右进行评估的。

3>&1 制作一个新的文件描述符3,该文件描述符是fd 1(stdout)的副本(副本)。

1>&2 将stdout(1)复制为fd 2(stderr)

2>&3 将fd 2复制为3,之前将其复制为stdout。

因此,现在将stderr和stdout切换了。

| tee foo.file Tee复制了被制成stderr的文件描述符1。


哦,未经ksh测试,可与bash一起使用...
Kyle Brandt

谢谢,也可以在ksh中使用。我认为大多数管道和流事物都是posix标准的。
C. Ross

“复制”并不是真的正确-参见@Guasqueño的答案。
凯尔·布​​兰特

这也适用于tee.exe安装了Windows的Windows :)
Acorn

13

Kyle的Unix / Linux命令完成了用STDOUT切换STDERR的工作。但是,解释并不完全正确。重定向运算符不执行任何复制或复制操作,它们只是将流重定向到另一个方向。

通过将3>&1临时移到末尾来重写Kyle的命令,将使理解该概念更加容易:

find /var/log  1>&2  2>&3  3>&1  

但是,以这种方式编写的Linux将显示错误,因为&3尚不存在,因为它位于3>&1之前。3>某种方法可以声明(定义)我们将使用第三条管道,因此必须在将水注入该管道之前将其定位,例如,凯尔(Kyle)编写该管道的方式。尝试这种其他方式只是为了好玩:

((echo "STD1";  anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR

没有办法复印是可耻的。您不能在同一命令中执行“ 3>&1 3>&2”之类的操作,因为Linux将仅使用找到的第一个,而忽略第二个。

我还没有找到一种既可以将错误又将常规输出发送到文件,还可以使用一个命令将错误的副本发送到标准输出的方法。对于instace,我有一个cron作业,我希望将两个输出(错误和标准)都发送到日志文件,并让错误也消失,以使电子邮件发送到我的blackBerry。我可以使用“ tee”使用两个命令来执行此操作,但是错误不会在文件的常规输出行中以正确的顺序显示。这是我解决问题的丑陋方式:

((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1

请注意,我必须两次使用log1,并且在两种情况下都必须追加,第一个使用“ tee”命令的“ -a”选项,第二个使用“ >>”。

进行cat log1,您将获得以下信息:

STD1
STD2
-bash: sdfr: command not found

请注意该错误不会显示在第二行中。


真棒改正!
凯尔·布​​兰特

签出zsh和mult_iosoption(默认情况下处于启用状态)可以多次重定向FD。
汤姆·黑尔

2

根据ksh(pdksh)的手册页,您可以执行以下操作:

命令2>&1> / dev / null | 猫-n

即dup stderr到stdout,将stdout重定向到/ dev / null,然后管道到'cat -n'

在我的系统上的pdksh上工作:

$ errorecho(){echo“ $ @”>&2;}

$ errorecho foo
富

$ errorecho foo> / dev / null#即使重定向了stdout也应该仍然显示
富

$ errorecho foo 2>&1> / dev / null | 猫-n
     1个
$   

也可以与BusyBox配合使用-Udo
G

1

我让它像您想要的那样运行,因为我也需要它并完善您的命令。现在对我来说,在使用此的debian挤压上使用bash 3.2可以正常工作

(echo "foo" 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1 >> log2

而log1记录stdout和stderr,而log2仅记录stderr,并且没有其他内容显示在屏幕上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.