Answers:
为此,请使用一个额外的文件描述符来切换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。
tee.exe
安装了Windows的Windows :)
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
请注意该错误不会显示在第二行中。
mult_ios
option(默认情况下处于启用状态)可以多次重定向FD。
根据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个 $