如何在不传输标准输出流的情况下传输标准错误流?
我知道这个命令有效,但它也写出了标准。
Command 2>&1 | tee -a $LOG
我怎样才能得到标准错误?
注意:我想要的只是将 stderr 流写入日志并将 stderr 和 stdout 写入控制台。
如何在不传输标准输出流的情况下传输标准错误流?
我知道这个命令有效,但它也写出了标准。
Command 2>&1 | tee -a $LOG
我怎样才能得到标准错误?
注意:我想要的只是将 stderr 流写入日志并将 stderr 和 stdout 写入控制台。
为此,请使用一个额外的文件描述符来切换 stderr 和 stdout:
基本上,它有效,或者至少我认为它有效,如下所示:
重定向是从左到右评估的。
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。Kyle 的 Unix/Linux 命令完成了将 STDERR 与 STDOUT 切换的工作;但是解释并不完全正确。重定向运算符不进行任何复制或复制,它们只是将流重定向到不同的方向。
通过临时将 3>&1 移到末尾来重写 Kyle 的命令,可以更容易理解这个概念:
虽然这样写,Linux 会显示一个错误,因为 &3 尚不存在,因为它位于 3>&1 之前。3>something 是一种声明(定义)我们将使用第三个管道的方法,因此必须在我们将水流入该管道之前对其进行定位,例如 Kyle 所写的方式。尝试这种其他方式只是为了好玩:
没有办法复制是一种耻辱。您不能在同一命令中执行诸如“3>&1 3>&2”之类的操作,因为 Linux 只会使用找到的第一个命令并忽略第二个命令。
我还没有(还)找到一种方法来将错误和常规输出发送到文件,并使用一个命令将错误的副本发送到标准输出。例如,我有一个 cron 作业,我希望两个输出(错误和标准)都进入日志文件,并让错误也出去,以便将电子邮件消息发送到我的 blackBerry。我可以使用“tee”使用两个命令来执行此操作,但错误在文件的常规输出行中没有以正确的顺序显示。这是我解决问题的丑陋方式:
请注意,我必须使用 log1 两次,并且在两种情况下都必须追加,第一次使用“tee”命令的“-a”选项,第二次使用“>>”。
做一个cat log1你会得到以下信息:
请注意,错误未按应有的方式显示在第二行中。
根据 ksh (pdksh) 的手册页,您可以这样做:
命令 2>&1 >/dev/null | 猫-n
即将标准错误复制到标准输出,将标准输出重定向到/dev/null,然后通过管道输入'cat -n'
适用于我系统上的 pdksh:
我让它像你想要的那样运行,因为我也需要它并完善你的命令。现在对我来说,使用 bash 3.2 在 debian 挤压上使用它可以正常工作
而 log1 记录 stdout 和 stderr,而 log2 只记录 stderr 而没有其他任何内容。