Dove vanno i miei codici di escape ANSI quando installo a un altro processo? Posso tenerli?


36

Qualche volta voglio convogliare l'output con codice colore per un processo, ad es. grep ... ma quando lo installo ad un altro processo, ad es. sed, i codici colore si perdono ...

È un modo per mantenere intatti questi codici?

Ecco un esempio che perde l'output colorato:

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

4
PS .. come informazioni generali .. Ho appena scoperto che lesspuò accettare un input di testo colorato (bello :) ... ad es .: tree -C ~/ |less -Roppurels -lR --color=always . |less -R
Peter.O

Risposte:


40

Molti programmi che generano output colorati rilevano se stanno scrivendo su un TTY e disattivano i colori se non lo sono. Questo perché i codici colore sono fastidiosi quando vuoi solo catturare il testo, quindi cercano di "fare la cosa giusta" automaticamente.

Il modo più semplice per catturare l'output del colore da un programma del genere è quello di dirgli di scrivere il colore anche se non è collegato a un TTY. Dovrai leggere la documentazione del programma per scoprire se ha quell'opzione. (ad esempio, grepha l' --color=alwaysopzione.)

Puoi anche usare lo expectscript unbufferper creare una pseudo-tty come questa:

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

2
grazie per le informazioni sul rilevamento di TTY e il falso fuori controllo!
shellter

@cjm .. Non funziona qui (su Ubuntu 10.04 / bash 4.1.5) ... ma il mio repository 10.04 ha solo una versione -dev, e nulla nei backport ... È un po 'tardi qui, quindi guarderò di nuovo domani ... ma come hai detto, questi programmi di colorazione probabilmente si alternano in base alla destinazione dell'output (mhhh ma come fanno a sapere che è tty..non importa) .. e potrebbero avere un'opzione per forzare it .. grazie ,,,
Peter.O

@fred, generalmente usano isatty per scoprire dove stdoutsta andando. In realtà non sono sicuro unbufferche funzioni quando si esegue il piping nel programma e anche da esso; Non l'ho installato qui per provare.
cjm

grazie per l' unbufferinformazione, aiuta l'output del mio bot IRC come l'output nella shell.
LiuYan

4

Per me funziona ;-! (nell'attuale ambiente MingW)

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

# barney viene visualizzato come testo rosso

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ... sì, questo particolare esempio grep funziona anche per me .. Non ero a conoscenza di quell'opzione fino a quando non hai pubblicato la risposta, quindi grazie per quello ... Comunque. Mi sto ancora chiedendo se esiste un modo generale per farlo .... ad esempio tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Forse (?) C'è un modo per ingannare una pipa nel pensare che stia generando un TTY .. o qualche soluzione simile. .
Peter.O

Ho appena controllato man tree... Anche questa ha un'opzione simile, -C... forse è una funzione comune per i programmi che
generano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.