如何pipe道stderr没有pipe道标准输出

如何pipe理标准错误stream而不将pipe道标准输出stream?

我知道这个命令有效,但是它也写出了标准。

Command 2>&1 | tee -a $LOG 

我怎样才能得到标准的错误?

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

要做到这一点,请使用一个额外的文件描述符来切换stderr和stdout:

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

基本上,它起作用,或者至less我认为它起作用,如下所示:
重新指导从左到右进行评估。

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

1>&2 make stdout(1)fd 2(stderr)的副本

2>&3使fd 2,3的副本(副本),这是以前作为stdout的副本。

所以现在stderr和stdout被切换。

| tee foo.file | tee foo.file tee复制了文件描述符1,它被制作成stderr。

Kyle的Unix / Linux命令完成了用STDOUT切换STDERR的工作; 然而,解释是不正确的。 redirect操作员不做任何复制或复制,只是将stream程redirect到不同的方向。

通过暂时将3&1暂时移动到末尾来重写Kyle的命令,将使其更容易理解这个概念:

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

这样写,Linux会显示一个错误,因为&3不存在,因为它位于3>&1之前。 3>有些东西是一种声明(定义)我们将要使用第三根pipe子的方法,所以在我们把水stream入pipe子之前,例如凯尔所写的那样,它必须被定位。 尝试另一种方式只是为了好玩:

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

没有办法做副本是一个耻辱。 你不能在同一个命令中做“3>&1 3>&2”,因为Linux只会使用第一个和第二个。

我还没有find一种方法将错误和常规输出都发送到一个文件,并用一个命令将错误的副本发送到标准输出。 对于instace,我有一个cron工作,我希望这两个输出(错误和标准)转到日志文件,并让错误也出去,使电子邮件发送到我的黑莓。 我可以用两个命令使用“tee”来完成,但是错误不会以正确的顺序显示在文件的常规输出行中。 这是我解决问题的难看方式:

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

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

做一个猫log1你得到以下几点:

 STD1 STD2 -bash: sdfr: command not found 

请注意,错误不会显示在第二行,因为它应该。

根据ksh(pdksh)的手册页,你可以做:

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

即将stderr复制到标准输出,将标准输出redirect到/ dev / null,然后pipe入'cat -n'

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

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

 $ errorecho foo
 FOO

 $ errorecho foo> / dev / null#应该仍然显示即使redirectstdout
 FOO

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

我知道它运行得像你想要的,因为我也需要它,并提炼你的命令。 现在对我来说,它工作正确使用bash 3.2在debian挤压使用这个

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

而log1日志stdout和stderr和log2只loggingstderr,没有别的东西放到屏幕上。