【问题标题】:How do I redirect both stderr and stout to multiple locations?如何将 stderr 和 stout 重定向到多个位置?
【发布时间】:2011-10-12 16:52:15
【问题描述】:

我需要在 bash 脚本中执行命令(在 freebsd6 上),并且我需要将命令的标准错误和标准输出发送到控制台、日志文件和 bash 变量。

所以,没有任何重定向,我想要的是:

result=`./command | tee output.log`

如果我按原样运行,则只有 stderr 进入控制台,只有 stdout 进入 output.log 文件和 $result 变量。我理解为什么会这样,但是许多不同重定向的尝试都未能将两个流都发送到所有三个位置。

如何将 stderr 和 stdout 都发送到所有三个位置?

【问题讨论】:

    标签: c unix redirect stderr tee


    【解决方案1】:
    result=`./command 2>&1 | tee output.log | tee /dev/tty`
    

    [编辑]

    作为 n.m.在评论中指出,tee 接受多个参数:

    result=`./command 2>&1 | tee output.log /dev/tty`
    

    [第二次编辑]

    借用 cmets 中 Chris 的一个想法,也可以这样做将输出发送到 stderr:

    result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&2)`
    

    要完全按照您的意愿行事,我发现最好的方法是:

    exec 3>&1 ; result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&3)` ; exec 1>&3
    

    (这里的整个问题是,反引号会在内部的任何内容执行之前重定向标准输出。所以这一行将旧标准输出保存并恢复为描述符 3,这可能是一个好主意,也可能不是一个好主意......)

    【讨论】:

    • tee 接受任意数量的参数,如... | tee output.log /dev/tty
    • 这种方法的一个问题 - 如果我想将我的父 bash 脚本的输出重定向到另一个文件,输出将不会被重定向到那里。
    • 您可以在支持它的系统上使用/dev/fd/2 而不是/dev/tty,但这会将所有输出发送到stderr(以及日志文件和$result),这可能不会做你想要的。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2011-05-23
    • 2012-08-07
    • 2014-09-30
    • 2022-01-18
    相关资源
    最近更新 更多