在将cout重定向到outfile时是否可以cout到终端?

时间:2010-01-27 21:20:35

标签: c++ bash shell redirect cout

我正在运行程序并将cout重定向到outfile,如下所示:

./program < infile.in > outfile.o  

我希望能够从命令行读取选项('-h'或'--help')并向终端输出帮助消息。有没有办法可以做到这一点,但仍然有其他程序的常规cout转到outfile?

cout会成为用于此类事情的正确对象吗?

6 个答案:

答案 0 :(得分:15)

您应该使用cerr将帮助消息输出到STDERR,这不包含在重定向到outfile.o中。

鉴于./program < infile.in > outfile.o

cout << "This writes to STDOUT, and gets redirected to outfile.";
cerr << "This doesn't get redirected, and displays on screen.";

如果稍后要重定向STDOUT和STDERR,则可以执行

./program < infile.in &> outfile.o

如果您只想重定向STDERR,但允许显示STDOUT,请使用

./program < infile.in 2> outfile.o

Bash redirection比大多数人意识到的要复杂得多,除了最简单的形式(“&gt;”)之外,其他所有内容都会被忽视。

答案 1 :(得分:3)

如果您使用的是Linux,则可以使用伪设备/dev/tty输出到控制终端(如果有)。即使重定向stderr以及stdout,这也会有效。其他操作系统可能提供类似的机制。

E.g。

#include <iostream>
#include <ostream>
#include <fstream>

int main()
{
        std::ofstream term("/dev/tty", std::ios_base::out);

        term << "This goes to terminal\n";
        std::cout << "This goes to stdout\n";

        return 0;
}

会像这样工作:

$ ./a.out
This goes to stdout
This goes to terminal
$ ./a.out >/dev/null
This goes to terminal

请注意,如果两个流独立地缓冲相对排序(如果它们输出到同一设备)的方式不一定保留。这可以通过在适当的时间冲洗流来调整。

答案 2 :(得分:2)

~$ cmd | tee log_filestdout复制到终端 ~$ cmd 2>log_filestdout打印到终端,将stderr打印到文件

答案 3 :(得分:1)

您可能希望将帮助消息输出到stderr。 Stderr通常用于非正常输出,您可以将使用段落视为此类输出。

答案 4 :(得分:1)

我做过的其中一件事 - 不是说这总是合适的 - 是编写具有类似签名的模块。

void write_out(ostream &o);

然后我可以创建fstream对象并传入它们,或传入cout和cerr,无论我当时需要什么。这有助于编写日志代码,有时您希望在终端上查看发生的情况,有时您只需要日志文件。

HTH。

答案 5 :(得分:0)

你应该使用cerr而不是cout。使用shell重定向&gt;只重定向stdout(cout),而不是stderr(cerr)。