Conserva i colori durante il piping per il raccordo a T


Risposte:


84

Basta inserire unbufferprima di qualsiasi comando per far credere che stia scrivendo su un output interattivo anche se in realtà esegue il piping in un altro eseguibile. Questo manterrà il colore nel caso di ls.

Per esempio

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

Se non lo hai già installato, su Ubuntu e altre distribuzioni Linux Debian puoi installarlo unbufferfacendo.

sudo apt-get install expect-dev

6
Un'altra soluzione, che non richiede installazione, è su stackoverflow.com/questions/3515208/…
Tgr

3
Questo fa sì che il file risultante contenga codici colore (ovviamente); esiste un modo per stampare il file in modo tale da utilizzare i codici colore e visualizzare correttamente i colori nel terminale?
Kyle Strand,

2
Ugh, che inserisce password mostra la tua password in chiaro!
AndiDog,

@Tgr Quella soluzione non ha funzionato per me su OS X cercando di ottenere l'output colorato grezzo di xcodebuild- invece ho ottenuto linee tritate senza colore. unbuffer xcodebuild | less -Rha funzionato perfettamente, tuttavia.
Slipp D. Thompson,

2
Non hai bisogno del expect-devpacchetto. expectè abbastanza.
Yajo,

11

Usa l'opzione ls --color=always

--color=auto non colorerà l'output verso una pipeline - per ovvi motivi.

La pagina principale dice quanto segue:

Con --color = auto, i codici colore vengono emessi solo se l'uscita standard è collegata a un terminale (tty).


2
OK. Questo lo spiega. Ma posso ancora vedere i colori sullo schermo? (Dopo tutto è un TTY). Non mi dispiace NON averli nel file di registro, ma sicuramente li voglio sul mio schermo.
Paweł Gościcki,

Penso di non essermi chiarito abbastanza. ls -lera solo un esempio. Ho un comando completamente diverso (registri heroku) che rimuove i colori quando viene convogliato tee. E voglio "riparare / cambiare" tee / pipe, non il comando che sto eseguendo.
Paweł Gościcki,

1
@Pawel, non puoi correggerlo facilmente in tee / pipe poiché tee / pipe non rimuovono questi codici colore. Il problema è che il comando iniziale vede che non sta scrivendo sul terminale. È necessario uno pseudo-terminale che si comporta come una pipe ma che i comandi vedono come un terminale.
RedGrittyBrick

Hm ... abbastanza giusto. Immagino che devo solo accettare che è così.
Paweł Gościcki,

3
@ PawełGościcki questa risposta risolve solo il problema ls. Vedi la mia risposta che risolve il problema per tutti i programmi, inclusi i registri di heroku.
Eamonn O'Brien-Strain,

3

Espanderò la scriptsoluzione fornita nel commento della risposta accettata. L'uso scriptpuò essere utile nel caso in cui non sia possibile o non si desideri installare il pacchetto prevede che contiene il unbuffercomando.

Stampa l' ls output su stdout e file con codici colore :

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

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

Visualizza il file di output con i colori:

less -r output.log

2
-eè uguale a --return- non è necessario per entrambi; -efqlo è --return --flush --quiet.
Noel Maersk,

@NoelMaersk Grazie. Ho incorporato le spiegazioni dei parametri nella risposta.
Juuso Ohtonen,
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.