为什么我的终端输出在运行纱线脚本时与其bash相同时不相同?
**注意:我已经添加更新,只要继续阅读,谢谢。 🙂 **
我一直很好奇这个 – 请看看我的这个截图运行:
-
ls -lah build
,和 -
yarn run assets
,运行ls -lah build
。
首先让我说这是一个在webpack中的WIP构建,所以不需要告诉我一个31M的bundle不是最优的。 🙂
但是为什么我会用本地命令获得颜色和更详细的字体,而不是在yarn
执行命令的时候? 这可能是相关的:这个屏幕截图是: – Windows 10 – Webstorm终端 – 登录到运行Ubuntu 14.4的docker容器
谢谢! 🙂
**更新:–color =总是恢复颜色**作为@Charles Duffy建议,添加--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
的颜色序列。