C. *_*oss 25 unix ksh pipe stderr
如何在不通过管道传输标准输出流的情况下传输标准错误流?
我知道这个命令有效,但它也会写出标准。
Command 2>&1 | tee -a $LOG
Run Code Online (Sandbox Code Playgroud)
我如何得到标准错误?
注意:我想要的是将 stderr 流写入日志并将 stderr 和 stdout 写入控制台。
Kyl*_*ndt 27
为此,请使用一个额外的文件描述符来切换 stderr 和 stdout:
find /var/log 3>&1 1>&2 2>&3 | tee foo.file
Run Code Online (Sandbox Code Playgroud)
基本上,它有效,或者至少我认为它有效,如下所示:
从左到右评估重定向。
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 复制了文件描述符 1,该文件描述符被制成 stderr。
Gua*_*eño 13
Kyle 的 Unix/Linux 命令完成了将 STDERR 与 STDOUT 切换的工作;然而解释并不完全正确。重定向操作符不做任何复制或复制,他们只是将流重定向到不同的方向。
通过将 3>&1 临时移动到末尾来重写 Kyle 的命令,可以更容易地理解这个概念:
find /var/log 1>&2 2>&3 3>&1
Run Code Online (Sandbox Code Playgroud)
但是这样写,Linux 会显示错误,因为 &3 尚不存在,因为它位于 3>&1 之前。3>something 是一种声明(定义)我们将使用第三个管道的方式,因此它必须在我们将水流入该管道之前定位,例如 Kyle 写的方式。试试这种其他方式只是为了好玩:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Run Code Online (Sandbox Code Playgroud)
没有办法复制是一种耻辱。您不能在同一命令中执行诸如 "3>&1 3>&2" 之类的操作,因为 Linux 将仅使用找到的第一个并关闭第二个。
我还没有(还)找到一种方法来将错误和常规输出发送到文件,并使用一个命令将错误的副本发送到标准输出。例如,我有一个 cron 作业,我希望两个输出(错误和标准)都转到日志文件,并让错误也出去,以便将电子邮件消息发送到我的黑莓。我可以使用“tee”通过两个命令来完成,但错误在文件的常规输出行中没有以正确的顺序显示。这是我解决问题的丑陋方法:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Run Code Online (Sandbox Code Playgroud)
请注意,我必须使用 log1 两次,并且在两种情况下都必须附加,第一个使用“-a”选项作为“tee”命令,第二个使用“>>”。
做一个cat log1你会得到以下信息:
STD1
STD2
-bash: sdfr: command not found
Run Code Online (Sandbox Code Playgroud)
请注意,该错误并没有像它应该的那样显示在第二行中。
归档时间: |
|
查看次数: |
23306 次 |
最近记录: |