C++ 中有没有办法判断 std::cout 和 std::cerr 是否指向同一个目的地?
也就是说,我希望能够区分程序何时启动
program或program > log 2>&1或program &> log
相对
program > log或program 2> errors或program > log 2> errors
(用例是这样一种情况,当它们分开时,我们希望将错误信息打印到 stdout 和 stderr,但如果它们都到达相同的目的地,则希望打印格式稍有不同的输出(不仅仅是串联) . -- 是的,我知道这并不理想,也不是官方推荐的做事方式,也不应该被视为标准的做事方式。但请相信我,不过,我们已经花时间思考问题,对于我们的特定用例,这是最好的选择。)
出于我们的目的,我们可以假设在程序本身内没有对 cout/cerr 重定向做任何事情(只是典型的 shell 级命令行重定向),所以如果有直接查看 stdout/stderr 的 C 级功能(而不是std::cout 和 std::cerr 流正确),这也可能有效。
这是XY 问题的另一个例子。
你真正想要实现的是:
对于我们的最终用户用例,我们希望确保指示发生了什么错误的消息最终出现在 stderr 和 stdout 中(因为根据我们的用户是否设置输出重定向,他们可能会或可能不会在一个或另一个。)我们可以只向每个内容打印一次(实际上是我们当前正在做的事情),但是如果 stdout 和 stderr 转到同一位置,如果我们可以重新格式化要删除的内容,那么它会更清晰,更用户友好多余的打印。
考虑到这一目标,更清晰的机制将允许用户指定他们希望错误消息发送到的位置。例如
the-program --error-destination "stdout"
the-program --error-destination "stderr"
the-program --error-destination "stdout,stderr"
the-program --error-destination "/tmp/errro-messages.txt"
the-program --error-destination "stdout,/tmp/errro-messages.txt"
Run Code Online (Sandbox Code Playgroud)
了解“stdout”和“stderr”是特殊目的地。其他任何东西都是文件。