Куди відправляються мої коди аварійних відхилень ANSI, коли я передаю інший процес? Чи можу я їх утримати?


36

Я колись хочу передати кольоровий вихідний сигнал у процесі, наприклад, grep ... але коли я передаю його іншому процесу, наприклад. sed, кольорові коди втрачаються ...

Чи є спосіб зберегти коди цих недоторканими?

Ось приклад, який втрачає кольоровий вихід:

echo barney | grep barney | sed -n 1,$\ p   

4
PS .. як загальна інформація .. Я щойно виявив, що lessможе приймати кольоровий текст (приємно :) ... наприклад: tree -C ~/ |less -Rабоls -lR --color=always . |less -R
Peter.O

Відповіді:


40

Багато програм, які генерують кольоровий вихід, виявляють, чи пишуть вони на TTY, і вимикають кольори, якщо їх немає. Це пояснюється тим, що кольорові коди дратують, коли ви хочете лише зафіксувати текст, тому вони намагаються "зробити правильно" автоматично.

Найпростіший спосіб зафіксувати кольоровий вихід з такої програми - це сказати йому записати кольори, навіть якщо він не підключений до TTY. Вам доведеться прочитати документацію програми, щоб з’ясувати, чи є у неї така опція. (наприклад, grepє --color=alwaysваріант.)

Ви також можете використовувати expectсценарій, unbufferщоб створити такий псевдо-tty:

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
дякую за цю інформацію про виявлення TTY та підробку скасування!
обстріл

@cjm .. Тут не працює (на Ubuntu 10.04 / bash 4.1.5) ... але в моєму репортажі 10.04 є тільки версія -dev, і нічого в підпорядках ... Тут трохи пізно, тому я подивлюся завтра знову ... але, як ви вже говорили, ці програми колоризації, ймовірно, перемикаються відповідно до вихідного пункту призначення (mhhh, але як вони знають, що це goiong to tty .. не має значення) .. і вони цілком можуть мати можливість змусити це .. дякую ,,,
Пітер.О

@fred, вони зазвичай використовують isatty, щоб дізнатися, куди stdoutйде. Я насправді не впевнений, чи unbufferпрацює, коли ви працюєте в програмі так само, як і поза нею; У мене тут не встановлено, щоб спробувати.
cjm

дякую за unbufferінформацію, це допомагає моєму боту IRC, як вихід у оболонці.
LiuYan 刘 研

4

Це працює для мене; -! (у поточному середовищі MingW)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# барні відображається у вигляді червоного тексту

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ... так, саме цей греп-приклад працює для мене. Я не знав про цей варіант, поки ти не опублікував відповідь, тож дякую за це ... Однак. Мені все ще цікаво, чи існує якийсь загальний спосіб зробити це .... наприклад tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Можливо, (?) Є спосіб, щоб надумати трубу на думку, що це виводиться на TTY .. або якийсь такий загальний спосіб вирішення. .
Пітер.О

Я щойно перевірив man tree... У нього теж є подібний варіант, -C... можливо, це загальна функція для програм, які виводять кольори кольорів уникнення ..
Peter.O
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.