Сохраняйте цвета во время прокачки


62
ls -l --color=auto | tee output.log

Без трубы / тройника она цветная. Как я могу сделать так, чтобы он оставался цветным во время использования tee(может быть окрашен только на экране, меня не волнуют цвета в журналах).


Ответы:


84

Просто вставьте unbufferперед любой командой, чтобы заставить ее думать, что она записывает в интерактивный вывод, даже если она фактически передается в другой исполняемый файл. Это сохранит цвет в случае ls.

Например

unbuffer ls -l --color=auto | tee output.log

Если у вас его еще нет, установите его в Ubuntu и других дистрибутивах Debian-ish Linux unbuffer.

sudo apt-get install expect-dev

6
Другое решение, которое не требует установки чего-либо, находится по адресу stackoverflow.com/questions/3515208/…
Tgr

3
Это приводит к тому, что полученный файл содержит цветовые коды (конечно); есть ли способ затем распечатать файл таким образом, который использует цветовые коды и правильно отображает цвета в терминале?
Кайл Стрэнд,

2
Тьфу, это заставляет записи пароля показывать ваш пароль в открытом виде!
AndiDog

@Tgr Это решение не работало для меня в OS X, пытаясь получить необработанный цветной вывод xcodebuild- вместо этого я получил нарезанные линии без цвета. unbuffer xcodebuild | less -Rработал безупречно, однако.
Слипп Д. Томпсон

2
Вам не нужна expect-devпосылка. expectдостаточно.
Яхо

11

Используйте опцию ls --color=always

--color=auto не будет цветной вывод на конвейер - по понятным причинам.

На главной странице написано следующее:

При --color = auto цветовые коды выводятся, только если стандартный вывод подключен к терминалу (tty).


2
ХОРОШО. Что объясняет его. Но можно ли все-таки как-то увидеть цвета на экране? (В конце концов, это TTY). Я не против, чтобы они НЕ были в лог-файле, но я наверняка хочу, чтобы они были на моем экране.
Павел Гольчицкий

Я думаю, что сделал себя недостаточно ясно. ls -lбыл просто примером. У меня совершенно другая команда (логи герою), которая удаляет цвета при передаче по трубопроводу tee. И я хочу «исправить / изменить» тройник / трубу, а не команду, которую я выполняю.
Павел Гольчицкий,

1
@ Павел, вы не можете легко исправить это в тройнике / трубе, поскольку тройник / труба не снимает эти цветовые коды. Проблема в том, что начальная команда видит, что она не пишет в терминал. Вам нужен псевдотерминал, который действует как канал, но команды видят как терминал.
RedGrittyBrick

Хм ... достаточно справедливо. Я думаю, мне просто нужно признать, что так оно и есть.
Павел Гольчицкий

3
@ PawełGościcki этот ответ только решает проблему для ls. Смотрите мой ответ, который решает проблему для всех программ, включая логи герою.
Имонн О'Брайен-Штрейн

3

Я расширю scriptрешение, приведенное в комментарии к принятому ответу. Использование scriptможет быть полезно, если вы не можете или не хотите устанавливать ожидаемый пакет, содержащий unbufferкоманду.

Вывести ls вывод в стандартный вывод и файл с цветовыми кодами :

script -efq output.log -c "ls -l --color=auto"

где ( man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

Просмотр выходного файла с цветами:

less -r output.log

2
-eтак же, как --return- нет необходимости в обоих; -efqесть --return --flush --quiet.
Ноэль Маерск

@ NoelMaersk Спасибо. Я включил объяснения параметров в ответ.
Юусо Охтонен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.