【问题标题】:Redirect stderr to terminal and also file in bash将stderr重定向到终端并在bash中归档
【发布时间】:2017-09-07 11:29:21
【问题描述】:

我这里有一个特殊的案例,可以总结如下:

我希望将整个错误/标准输出消息从我的脚本重定向到一个文件,但还有一个特定的行我想重定向到终端并将其重定向到文件。

这是代码:

exec &>test.log
echo "Check if this line is going to test.log"
echo "This should go to stderr" >> /dev/stderr

现在最后一行应该同时进入 stderr 和 test.log。

这可以在 bash 中以某种方式实现吗?

【问题讨论】:

  • 我可以撤回我的重复标志吗?我链接到的帖子只有他回答问题所需的一半,所以它并不是真正的重复。
  • 好的,我删除了关于副本的评论。我希望也能删除标志。
  • 实际上该标志仍然存在,但现在我指定了不同的副本,您提出的重复信息已经消失。如果您建议的副本有用,可以将其添加到“这里已经有答案”框中(请告诉我)。
  • @tripleee:这个问题不是那个问题的重复。对“tee”的需求是一样的;最初我提出了这个解决方案。但这并没有解决他的问题,因为他的脚本开头有 exec 调用,所以 stderr 已经重定向到文件。所以“tee”只是用最后一行覆盖文件;控制台中看不到任何内容,并且文件中的早期条目丢失。还需要两件事(针对他的案例正确处理 exec)和 tee 的“-a”选项。如果没有这三件事(“tee”、“-a”和适当的 exec 处理他的案例),他就没有解决方案。

标签: bash redirect


【解决方案1】:

是的,tee 命令允许您将输出定向到一个或多个文件以及标准输出。

正如您在评论中指出的那样,由于 exec 命令,这本身不起作用。

这应该做你想做的:

exec 3>&1 1>test.log
echo "Check if this line is going to test.log"
exec 1>&3 3>&-
echo "Maybe this should go to stderr" | tee -a test.log >> /dev/stderr

我从here获得了关于通过正确设置原始exec来恢复stderr的方法的信息,并将其与tee结合起来。

【讨论】:

  • 终端仍然没有任何输出,我想那是因为我已经在开头添加了 exec 。有什么方法可以在消息之前禁用 exec 吗?
  • 我不认为你可以“禁用”执行。它已重定向当前进程的文件描述符。使用“tee”,输出被重定向到 test.log 和 stderr——但是您已经更改了 stderr 和 stdout 以转到文件。实际上,我希望通过“tee”将输出发送到文件,并将 stderr 重定向到文件,您会在文件中看到此行两次。在任何情况下,您都重定向了 stderr(和 stdout),所以该行确实转到了 stderr,但它已被重定向到文件。
  • 好的,我想我已经成功了。我编辑了答案。请注意,您必须将“-a”与“tee”一起使用,否则会覆盖文件。
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2012-11-19
  • 1970-01-01
  • 2010-10-14
  • 2021-05-11
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多