`docker 记录 foo | less` 不可搜索或滚动,但 `docker logs foo 2>&1 | 少是

Mag*_*dow 13 less pipe stdout stderr

使用任何一种都可以提供可读的文本。但只有使用 stderr 重定向才能滚动或键入 /somepattern 并获得匹配项。

没有它,搜索会给出“没什么可搜索的(按 RETURN)”和一列 ~ 的。

鉴于,stderr 和 stdout 不一样,但为什么在我开始用 less 做某事之前,为什么 less 显示它们相同?

这可能是我不明白的一些奇怪的多窗口 vim 东西。想法?

Gil*_*il' 9

+--------------------+        +------+       +----------+
|             stdout |·······?| less |——————?|          |
| somecommand        |        +------+       | terminal |
|             stderr |——————————————————————?|          |
+--------------------+                       +----------+
Run Code Online (Sandbox Code Playgroud)

如果somecommand仅将文本打印到标准错误,那么当您运行somecommand | less,somecommandless都显示到终端。该命令在其 stderr 上的输出不会less直接发送到终端,因为它没有被重定向。首先somecommandscrolls by while less的输出初始化并显示其提示行;然后当somecommand完成时较少注意到其输入已完成(因为管道已关闭)。您可能想尝试一下:运行

{ sleep 1; somecommand; sleep 1; } | { sleep 0; less; }
Run Code Online (Sandbox Code Playgroud)

以及睡眠时间的变化,以便somecommand在 less 准备好之前或之后产生输出,并查看管道关闭时会发生什么。