![`docker 日志 foo | less` 不可搜索或滚动,但 `docker logs foo 2>&1 |少`是](https://linux22.com/image/86575/%60docker%20%E6%97%A5%E5%BF%97%20foo%20%7C%20less%60%20%E4%B8%8D%E5%8F%AF%E6%90%9C%E7%B4%A2%E6%88%96%E6%BB%9A%E5%8A%A8%EF%BC%8C%E4%BD%86%20%60docker%20logs%20foo%202%3E%261%20%7C%E5%B0%91%60%E6%98%AF.png)
使用其中任何一种都可以得到可读的文本。但只有使用 stderr 重定向才能滚动或输入 /somepattern 并获得匹配。
如果没有它,搜索会给出“无内容可搜索(按 RETURN)”和一列〜。
鉴于,stderr 和 stdout 不一样,但是为什么 less 显示它们相同,直到我开始用 less 做一些事情?
这可能是一些我不明白的奇怪的多窗口 vim 的东西。想法?
答案1
+--------------------+ +------+ +----------+
| stdout |·······→| less |——————→| |
| somecommand | +------+ | terminal |
| stderr |——————————————————————→| |
+--------------------+ +----------+
如果somecommand
仅将文本打印到标准错误,则当您运行 时somecommand | less
,somecommand
和less
都会显示到终端。该命令在其 stderr 上的输出不会less
,而是直接输出到终端,因为它没有被重定向。首先somecommand
,当 less 初始化时,输出滚动并显示其提示行;然后当完成时,somecommand
less 注意到它的输入已完成(因为管道已关闭)。您可能想尝试一下:运行
{ sleep 1; somecommand; sleep 1; } | { sleep 0; less; }
以及睡眠时间的变化,以便somecommand
在较少的准备就绪之前或之后产生输出,并查看管道关闭时会发生什么。