gpt4 book ai didi

c - 如何将 stderr 和 stout 重定向到多个位置?

转载 作者:行者123 更新时间:2023-12-01 11:56:23 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

[编辑]

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

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

[第二次编辑]

借用 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,这可能是也可能不是一个好主意......)

关于c - 如何将 stderr 和 stout 重定向到多个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com