为什么当 运行 纱线脚本与它的 bash 等效时,我的终端输出不相同?
Why is my terminal output not identical when running a yarn script vs its bash equivalent?
**注意:我已按顺序添加更新,请继续阅读,谢谢。 :) **
我对此很好奇——请看我的截图运行:
ls -lah build
,以及
yarn run assets
,运行 ls -lah build
。
首先让我说这是 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
.
**注意:我已按顺序添加更新,请继续阅读,谢谢。 :) **
我对此很好奇——请看我的截图运行:
ls -lah build
,以及yarn run assets
,运行ls -lah build
。
首先让我说这是 webpack 中的 WIP 构建,所以无需告诉我 31M 的包不是最佳的。 :)
但为什么我使用本机命令获得颜色和更详细的字体,而不是 yarn
执行命令时?这可能是相关的:这个屏幕截图是:
- Windows 10
- 网络风暴终端
- 登录到 docker 容器 运行 Ubuntu 14.4
谢谢! :)
** 更新:--color=总是恢复颜色 **
正如 @Charles Duffy 建议的那样,在 yarn 脚本中添加 --color=always
保留了格式:
如果有人有一些专业知识可以分享这里发生的事情,我很想听听!谢谢!
简短(大概)回答:到底发生了什么?
下面的答案假定 ls
.
有几种可能性在起作用:
- 您的交互式终端的选项可能会被 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
.