为什么当 运行 纱线脚本与它的 bash 等效时,我的终端输出不相同?

Why is my terminal output not identical when running a yarn script vs its bash equivalent?

**注意:我已按顺序添加更新,请继续阅读,谢谢。 :) **

我对此很好奇——请看我的截图运行:

首先让我说这是 webpack 中的 WIP 构建,所以无需告诉我 31M 的包不是最佳的。 :)

但为什么我使用本机命令获得颜色和更详细的字体,而不是 yarn 执行命令时?这可能是相关的:这个屏幕截图是: - Windows 10 - 网络风暴终端 - 登录到 docker 容器 运行 Ubuntu 14.4

谢谢! :)

** 更新:--color=总是恢复颜色 ** 正如 @Charles Duffy 建议的那样,在 yarn 脚本中添加 --color=always 保留了格式:

如果有人有一些专业知识可以分享这里发生的事情,我很想听听!谢谢!

简短(大概)回答:到底发生了什么?

下面的答案假定 ls.

的 GNU 实现

有几种可能性在起作用:

  • 您的交互式终端的选项可能会被 shell 别名修改。 type ls 的输出将表明这是否正确。
  • 您可能通过别名或等效环境变量启用了 ls --color=auto;不管怎样,这会检查它是否直接写入 TTY,如果是,则只启用颜色。

如果输出不是直接到 TTY(例如,如果输出在打印之前被 yarn 捕获),ls --color=auto 不会着色。

要解决此问题,您可以显式传递 ls --color=always 或其等效项,只需 ls --color。这涵盖了两种情况:如果您有一个正在使用的别名,代表您传递 --color=auto,显式传递它意味着您不再需要该别名。相比之下,如果 yarn 正在捕获内容而不是将其直接传递给 TTY,则 --color=always 告诉 ls 忽略 isatty() 返回 false 并无论如何着色。


上述含义的背景:

A "TTY" 实际上是一个终端。它提供专门用于提供用户实际打字的设备的铃声和口哨声(字面意思,用于铃声)。这意味着它具有用于检查和修改光标位置的控制序列,以及 - 与我们的目的相关 - 用于更改呈现输出的颜色。

A "FIFO" 是一个管道——它将字符从 A 点移动到 B 点,先进先出。在 prog-one | prog-two 的情况下,连接这两者的是一个 FIFO。它只是移动字符,没有光标位置或着色或其他任何概念。

如果 ls 试图在其输出中放置颜色序列,而该输出是针对终端以外的任何目的地,那么这些序列将没有任何意义——事实上,非常 format 需要打印的彩色标记由指定当前活动终端类型的 TERM 变量确定。

如果您 运行 ls --color,那么,您承诺 ls 它的输出 真的会 由终端呈现,或者(至少)其他理解适合当前配置的颜色序列的东西 TERM.