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

时间:2017-07-22 21:08:30

标签: docker terminal yarn tty

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

我对此非常好奇 - 请看我运行的截图:

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

bash_vs_yarn

首先我要说这是webpack中的WIP构建,所以不需要告诉我31M捆绑不是最优的。 :)

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

谢谢! :)

**更新: - color =始终恢复颜色** 如@Charles Duffy建议的那样,在纱线脚本中添加--color=always会保留格式:

color_always

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

1 个答案:

答案 0 :(得分:1)

简短(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并着色。

上述内容的背景意义:

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

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

如果ls尝试将颜色序列放在其输出中,当该输出用于终端以外的任何目的地时,那些序列将没有任何意义 - 实际上,非常格式需要打印着色标记由TERM变量确定,该变量指定当前活动的终端类型。

如果您运行ls --color,那么,您承诺ls其输出确实将由终端呈现,或者(至少)否则了解适合当前配置的TERM的颜色序列。