【问题标题】:How to redirect both OUT and ERR to one file and only ERR to another如何将 OUT 和 ERR 都重定向到一个文件,而仅将 ERR 重定向到另一个文件
【发布时间】:2021-05-26 05:02:09
【问题描述】:

专家您好
我想输出命令并将错误附加到一个文件中,例如 command > logOutErr.txt 2>&1
但我也希望 err 也附加到另一个 command 2> logErrOnly.txt

# This is a non working redirection
exec 1>> logOutErr.txt 2>> logOutErr.txt 2>> logErrOnly.txt

# This should be in Out log only
echo ten/two: $((10/2))

# This should be in both Out and Out+Err log files
echo ten/zero: $((10/0))

我知道最后一个重定向2>> 会覆盖前面的...那又怎样?球座?但是怎么做?

我必须在脚本开头做一次,不修改脚本的其余部分(因为它是动态生成的,任何修改都太复杂了)

请不要只用理论的链接来回答,我已经花了两天时间阅读所有内容都没有很好的结果,我想要一个工作示例
谢谢

【问题讨论】:

  • 仅使用标准接口,这样做的唯一可能方法将破坏排序保证(这意味着如果您将第 1 行写入 stdout,将第 2 行写入 stderr,然后将第 3 行写入 stdout,您可以在你的输出中得到 line-2->line-1->line-3)
  • ...确实如此,因为操作系统仅提供单个文件描述符本地的排序保证;当您的 stdout 和 stderr 描述符指向不同的位置时,它们现在是两个不同的对象,并且仅具有相对于对同一描述符的其他写入的保证(因此您仍然保证对 stdout 的一次写入将在另一次对 stdout 的写入之前发生, 或者对 stderr 的一次写入将在另一次对 stderr 的写入之前发生;但是您无法保证以什么顺序处理对 stdout 的写入和对 stderr 的单独写入)。
  • ...请注意上面的“仅使用标准接口”注释——我确实描述了如何在知识库的其他地方使用非标准接口来做到这一点(但因为它已经在其他地方描述过,如果你问如何再做一次,那将是重复的)。

标签: linux bash stderr io-redirection


【解决方案1】:

如果您这样做会失去订购保证:

#!/usr/bin/env bash
exec >>logOutErr.txt 2> >(tee -a logErrOnly.txt)

# This should be in OutErr
echo "ten/two: $((10/2))"

# This should be in Err and OutErr
echo "ten/zero: $((10/0))"

这是因为重定向是从左到右处理的:当tee 启动时,它的标准输出已经指向logOutErr.txt,所以它在第一次写入logErrOnly.txt 后附加到那个位置。

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多