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

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

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

Павел Гольчицкий
источник
Уже спрашивал на Unix и Linux .
Дан Даскалеску

Ответы:

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).

RedGrittyBrick
источник
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 Спасибо. Я включил объяснения параметров в ответ.
Юусо Охтонен