如何在linux shell上显示完整输出?

时间:2015-01-30 20:57:58

标签: linux shell

我有一个运行并显示GUI窗口的程序。它还在shell上打印了很多东西。我需要查看打印的第一件事和打印的最后一件事。问题是,当程序终止时,如果我滚动到窗口的顶部,则删除打印时打印的东西。所以在程序期间打印的东西现在位于顶部。这意味着我无法查看打印的第一件事。

我也试过> out.txt,但问题是当我手动关闭GUI窗口时,文件才会被关闭和读取。如果它被发送到文件,屏幕上什么都没有打印,我无法知道程序是否完成。我也无法修改任何代码。

有没有办法可以看到shell上打印的整个文本列表?

由于

2 个答案:

答案 0 :(得分:1)

当程序的输出进入终端窗口时,程序通常会在每个换行符后刷新其输出。这就是您以交互方式查看输出的原因。

当您将程序的输出重定向到out.txt时,它只会在其内部缓冲区已满时刷新其输出,这可能是在每个8KiB输出之后。这就是为什么你没有立即看到文件中的任何内容,并且你看不到程序打印的最后一些内容,直到它退出(并刷新它的最后一个部分完整的缓冲区)。

你可以欺骗程序认为它正在使用script命令将其输出发送到终端:

script -q -f -c myprogram out.txt

script命令运行myprogram连接到新分配的“伪终端”(或简称为pty)。这会诱使myprogram认为它正在与终端通信,因此它会在每个换行符上刷新其输出。 script命令将myprogram的输出复制到终端窗口和文件out.txt

请注意,script会向out.txt写一个标题行。我找不到在我的测试Linux系统上禁用它的方法。

在上面的例子中,我假设你的程序没有参数。如果是,则需要将程序和参数放在引号中:

script -q -f -c 'myprogram arg1 arg2 arg3' out.txt

或者将程序命令行放在shell脚本中,并将该shell脚本传递给script命令。

答案 1 :(得分:1)

您可以使用tee命令在终端上获取文件中的输出/错误:

your-command |& tee out.log

虽然请记住,默认情况下此输出是行缓冲的(大小为4k)。