Linux less 行为和 stderr

Linux less 行为和 stderr

我正在用 观察复杂命令的输出less,问题是stderr会丢失。stderr行通常会列在stdout内的行之间less。我希望将它们打印到控制台上,当我退出 时less,可以看到它们一起出现。

我意识到这可能没有解决方案,我读过相关内容teemultitee但到目前为止还没有运气。

答案1

或许

command 2> command.err | less; cat command.err; rm command.err

附录

以下是对忽视小心阅读了问题并且没有阅读上述 OP 的澄清评论。

haelix 指出:

stderr 行通常会列在 less 中的 stdout 行之间

并在给早期回答者的评论中写道:

你告诉我如何将 stderr 重定向到 stdout,但这不是我想要的。我不希望 stderr 与 less 中的 stdout 混合。我希望退出 less 时 stderr 出现在终端中

该问题可能与平台有关,这肯定是我在较旧的 Unix SVR4 平台上遇到过的问题。

如果你在这样的平台上做了类似的事情

 find / ... | less

任何错误消息(例如目录权限)在 less 中都像这样出现

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

因此输出行会被错误消息所掩盖。

如果您刷新页面,输出行会正确显示,但错误消息会丢失。退出 less 时,屏幕会清空,只剩命令提示符。

如果你做类似的事情

  find / ... 2>&1 | less

错误消息与标准输出混杂在一起。再次退出 less 时,屏幕是空白的。

如果您希望首先仅仔细查看 less 中的标准输出,然后在退出 less 后查看错误消息,则您需要不同的解决方案。

这就是我在最初的两行答案中暂时提出的建议。

答案2

您必须重定向stderrstdout

$ ./somecommad 2>&1 | less

检查你的 shell 手册(例如man bash

答案3

只需告诉 shell 将 fd 2 重定向到 fd 1 (stderr 到 stdout)

 make 2>&1 | less

答案4

你需要理解“文件描述符”的概念。通常,一个unix应用程序会以三个特殊的文件描述符启动:

  • 标准输入
  • 标准输出
  • 标准误差

|外壳中的“管道”stdout将一个进程与stdin下一个进程连接起来。

错误在设计上不会影响到stdin下一个流程。它们通常对下一个应用程序没有意义,因此不应该对用户隐藏。

如果要将错误混入 stdout,可以使用例如2>&1,其本质上表示“将 stderr 附加到 stdout”。例如

find /etc 2>&1 | less

还应包括无法访问的文件的错误输出。

find /etc 2>&1 >/dev/null | less

只会给你错误。

相关内容