** ПРИМЕЧАНИЕ. Я добавил обновления по порядку, просто продолжайте читать, спасибо. :) **

Мне это было очень любопытно - посмотрите этот снимок экрана, на котором я работаю:

  • ls -lah build и
  • yarn run assets, который запускает ls -lah build.

bash_vs_yarn

Позвольте мне начать с того, что это WIP-сборка в webpack, поэтому нет необходимости говорить мне, что пакет 31M не является оптимальным. :)

Но почему я получаю цвета и более подробный шрифт с помощью собственной команды, а не когда yarn выполняет команду? Это может быть актуально: этот снимок экрана: - Windows 10 - Терминал Webstorm - авторизовался в докер-контейнере под управлением Ubuntu 14.4

Благодарность! :)

** ОБНОВЛЕНИЕ: --color = всегда восстанавливает цвет ** Как предлагал @Charles Duffy, добавление --color=always в скрипт пряжи сохранило форматирование:

color_always

Если у кого-то есть какие-то специальные знания о том, что здесь происходит, я хочу это услышать! Спасибо!

1
SterlingVix 23 Июл 2017 в 00:08
1
Обычно это означает, что yarn (что бы это ни было) захватывает вывод, а затем сам распечатывает его. ls --color=auto (по умолчанию во многих местах) проверяет, идет ли его вывод непосредственно в TTY, и включает цвет, только если это так; если этот вывод захватывается другой программой, stdout будет FIFO, а istty() будет ложным.
 – 
Charles Duffy
23 Июл 2017 в 00:11
Посмотрите, не ведет ли себя ls --color=always (который, в отличие от --color=auto, игнорирует проверку) по-другому.
 – 
Charles Duffy
23 Июл 2017 в 00:13
Да спасибо! Мне нравится этот ответ, но я не понимаю его 75%! :) Я занимаюсь веб-разработкой, и я не скучаю по терминалу, но не могли бы вы расширить свой ответ, предполагая, что я очень мало знаю о том, что происходит с std -in -out -err -whatever?
 – 
SterlingVix
23 Июл 2017 в 00:13
Я попытался написать ответ, который дает как можно больше информации - если вам нужно больше, не могли бы вы задать конкретные вопросы?
 – 
Charles Duffy
23 Июл 2017 в 00:21
Вы были быстрее меня, мои извинения! Вы ответили на мой вопрос и вдобавок дали мне кучу информации - спасибо !!!
 – 
SterlingVix
23 Июл 2017 в 00:24

1 ответ

Лучший ответ

Краткий (иш) ответ: что на самом деле происходит?

Приведенный ниже ответ предполагает реализацию GNU ls .

Есть несколько возможностей:

  • Параметры вашего интерактивного терминала могут быть изменены псевдонимом оболочки. Выходные данные из 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, и в любом случае раскрашивать.


Справочная информация о том, что означает вышеизложенное:

По сути, TTY - это терминал. Он предоставляет навороты ( буквально , для колокольчиков), специально предназначенные для предоставления устройства, на котором пользователь фактически набирает текст. Это означает, что у него есть управляющие последовательности для проверки и изменения местоположения курсора и - что уместно для наших целей - для изменения цвета, с которым отображается вывод.

«FIFO» представляет собой канал - он перемещает персонажей из точки A в точку B по принципу «первым пришел - первым ушел». В случае prog-one | prog-two то, что связывает эти два, - это FIFO. Он просто перемещает символы и не имеет понятия о расположении курсора, раскраске или чему-либо еще.

Если бы ls попытался поместить цветовые последовательности в свой вывод, когда этот вывод предназначен для любого назначения, кроме терминала, эти последовательности не имели бы никакого смысла - действительно, сам формат в какие маркеры раскраски необходимо напечатать, определяется переменной TERM, определяющей текущий активный тип терминала.

Если вы запустите ls --color, то вы обещаете ls, что его вывод действительно будет отображаться терминалом или (по крайней мере) в противном случае что-то, что понимает цветовые последовательности соответствует текущему настроенному TERM.

1
Charles Duffy 23 Июл 2017 в 00:22
Это значительно расширило мое понимание того, что происходит на этом уровне терминала - и почему я вижу много дурацких символов [0E3m%] в кучу моих журналов, поскольку я предполагаю, что они цветные последовательности записываются в файл, а не в TTY! Потрясающе, потрясающе, огромное спасибо!
 – 
SterlingVix
23 Июл 2017 в 00:31