我正在用 观察复杂命令的输出less
,问题是stderr
会丢失。stderr
行通常会列在stdout
内的行之间less
。我希望将它们打印到控制台上,当我退出 时less
,可以看到它们一起出现。
我意识到这可能没有解决方案,我读过相关内容tee
,multitee
但到目前为止还没有运气。
答案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
答案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
只会给你错误。