为什么我的终端输出在运行纱线脚本时与其bash相同时不相同?

**注意:我已经添加更新,只要继续阅读,谢谢。 🙂 **

我一直很好奇这个 – 请看看我的这个截图运行:

  • ls -lah build ,和
  • yarn run assets ,运行ls -lah build

bash_vs_yarn

首先让我说这是一个在webpack中的WIP构建,所以不需要告诉我一个31M的bundle不是最优的。 🙂

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

谢谢! 🙂

**更新:–color =总是恢复颜色**作为@Charles Duffy建议,添加--color=always在纱线脚本中保存格式:

color_always

如果有人有一些专业知识来分享这里发生的事情,我在市场上听到它! 谢谢!

短(ish)答案:究竟是怎么回事?

下面的答案假定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和colorize。


背景以上是什么意思:

“TTY”实际上是一个终端。 它提供了专门用于提供用户实际正在键入的设备的花里胡哨( 字面上 ,为钟声)。 这意味着它具有用于检查和修改光标位置的控制序列,并且针对我们的目的有针对性地改变呈现输出的颜色。

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

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

如果你运行ls --color ,那么你有希望ls的输出真的会被终端渲染,或者(至少)能理解适合当前配置的TERM的颜色序列。