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

How to show full output on linux shell?

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

我也尝试过 > out.txt,但问题是文件只有在我手动关闭 GUI window 时才会关闭并可读。如果它输出到文件,屏幕上不会打印任何内容,我也无法知道程序是否完成。我也不能修改任何代码。

有没有办法让我看到打印在 shell 上的整个文本列表?

谢谢

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

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

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

script -q -f -c myprogram out.txt

script 命令运行 myprogram 连接到 newly-allocated “pseudo-terminal”(或简称 pty)。这使 myprogram 认为它正在与终端对话,因此它会刷新每个换行符的输出。 script 命令将 myprogram 的输出复制到您的终端 window 和文件 out.txt.

请注意 script 会将 header 行写入 out.txt。我找不到在我的测试 Linux 系统上禁用它的方法。

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

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

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

您也可以在终端上使用 tee 命令在文件中获取 output/error:

your-command |& tee out.log

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