Зберігайте кольори під час підключення до трійника


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

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


Відповіді:


84

Просто вставте unbufferперед будь-якою командою, щоб вона подумала, що вона пише на інтерактивний вихід, навіть якщо вона насправді переходить на інший виконуваний файл. Це збереже колір у випадку ls.

Наприклад

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

Якщо ви ще не встановили його, на Ubuntu та інших дистрибутивах Debian 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достатньо.
Yajo

11

Використовуйте опцію ls --color=always

--color=auto не буде кольоровим виведенням на трубопровід - з очевидних причин.

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

З --color = auto, кольорові коди виводяться лише у тому випадку, якщо до терміналу підключено стандартний вихід (tty).


2
ГАРАЗД. Це пояснює це. Але чи можу я ще якось бачити кольори на екрані? (Зрештою, це TTY). Я не заперечую, щоб вони не мали їх у логінфайлі, але я, безумовно, хочу їх на своєму екрані.
Paweł Gościcki

Я думаю, що я зробив себе недостатньо зрозумілим. ls -lбув лише прикладом. У мене зовсім інша команда (heroku logs), яка знімає кольори під час передачі tee. І я хочу "виправити / змінити" трійник / трубу, а не команду, яку я виконую.
Paweł Gościcki

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

Гм ... досить справедливо. Гадаю, мені просто потрібно прийняти, що так воно і є.
Paweł Gościcki

3
@ PawełGościcki ця відповідь лише вирішує проблему ls. Дивіться мою відповідь, яка виправляє проблему для всіх програм, включаючи журнали heroku.
Еймон О'Браєн-Штайн

3

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

Роздрукувати ls вихід у stdout та файл із кольоровими кодами :

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 Дякую Пояснення параметрів я включив у відповідь.
Juuso Ohtonen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.