重定向不起作用

问题描述:

我想将程序的输出放入文件中。我键入的以下内容:重定向不起作用

./prog > log 2>&1 

但并没有什么文件中“日志”。我使用的是Ubuntu 11.10,默认的shell是bash。

有人知道这个原因以及我该如何调试?

+2

如果你只是运行./prog,它是否会产生任何输出? –

+0

@Moishe:是的。我的程序中有一堆printf语句。 – Rich

+0

@Moishe:是否打电话给打印出来的图书馆有潜在的问题? – Rich

有许多可能的原因:

  • 该程序从log文件读取输入,而你试图重定向到它截断(见Why doesn't "sort file1 > file1" work?
  • 输出缓冲,让你不看到文件中的数据,直到输出缓冲区被刷新。如果使用C++ I/O流,则可以手动调用fflush或输出std::flush
  • 该程序足够智能并且在输出流不是终端时禁用输出。
  • 你看错文件(即在另一个目录中)。
  • 您尝试错误地转储文件的内容。
  • 您的程序输出'\ 0'作为第一个字符,因此输出看起来是空的,即使有一些数据。
  • 命名您自己的。

你最好的选择是在调试器下运行该应用程序(如gdb),或使用straceptrace(或两者),看看该程序在做什么。我的意思是,实际上,输出重定向在40年后的最后一次工作,所以问题必须在其他地方。

+0

我的程序没有输入。还有一堆printf语句。那么,我确实使用过gnu科学库,它的一些例程也有printf语句。我想我会尝试刷新标准输出缓冲区。任何快速的方式来做到这一点在C? – Rich

+0

@Rich:在C中,'fflush(stdout);'做得相当好。 – 2011-11-04 02:56:03

+0

当我不使用该库(gsl btw)时,重定向可以找到。无论何时我调用函数(如果它很重要,模拟退火),重定向都不起作用。图书馆是否搞砸了一切?在gsl_simulated_annealing手册中,它说“它将打印到标准输出”。输出流会有争用吗?我不知道如何使用gdb来跟踪重定向。 – Rich