GNU/Linux >> Linux Esercitazione >  >> Linux

Configurare la shell per stampare Stderr e Stdout in diversi colori?

Voglio impostare il mio terminale in modo stderr è stampato in un colore diverso da stdout; forse rosso. Ciò renderebbe più facile distinguere i due.

C'è un modo per configurarlo in .bashrc ? In caso negativo, è possibile?

Nota :Questa domanda è stata fusa con un'altra che richiedeva stderr , stdout e l'eco di input dell'utente da produrre in 3 diversi colori . Le risposte potrebbero rispondere a entrambe le domande.

Risposta accettata:

Questa è una versione più difficile di Mostra solo stderr sullo schermo ma scrivi sia stdout che stderr su file.

Le applicazioni in esecuzione nel terminale utilizzano un unico canale per comunicare con esso; le applicazioni hanno due porte di uscita, stdout e stderr, ma sono entrambe collegate allo stesso canale.

Puoi collegarne uno a un canale diverso, aggiungere colore a quel canale e unire i due canali, ma ciò causerà due problemi:

  • L'output unito potrebbe non essere esattamente nello stesso ordine come se non ci fosse stato alcun reindirizzamento. Questo perché l'elaborazione aggiunta su uno dei canali richiede (poco) tempo, quindi il canale colorato potrebbe essere ritardato. Se viene eseguito un buffering, il disturbo sarà peggiore.
  • I terminali utilizzano sequenze di escape che cambiano colore per determinare il colore del display, ad es. ␛[31m significa "passare al primo piano rosso". Ciò significa che se un output destinato a stdout arriva proprio mentre viene visualizzato un output per stderr, l'output sarà colorato in modo errato. (Ancora peggio, se c'è un cambio di canale nel mezzo di una sequenza di escape, vedrai spazzatura.)

In linea di principio, sarebbe possibile scrivere un programma che sia in ascolto su due pty¹, in modo sincrono (cioè non accetterà input su un canale mentre sta elaborando l'output sull'altro canale) e immediatamente emesso al terminale con istruzioni di cambio colore appropriate. Perderai la possibilità di eseguire programmi che interagiscono con il terminale. Non conosco alcuna implementazione di questo metodo.

Un altro possibile approccio sarebbe quello di far sì che il programma produca le corrette sequenze di cambio colore, agganciandosi a tutte le funzioni libc che chiamano write chiamata di sistema in una libreria caricata con LD_PRELOAD . Vedi la risposta di Sickill per un'implementazione esistente, o la risposta di Stéphane Chazelas per un approccio misto che sfrutta strace .

In pratica, se applicabile, suggerisco di reindirizzare stderr a stdout e di eseguire il piping in un colorizer basato su pattern come colortail o multitail, o colorizer per scopi speciali come colorgcc o colormake.

Correlati:come rimuovere /volumi/ dal servizio di automazione utilizzando lo script di shell esistente?

¹ pseudo-terminali. Le pipe non funzionerebbero a causa del buffering:la sorgente potrebbe scrivere nel buffer, interrompendo la sincronia con il colorizer.


Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. Output su Stdout e allo stesso tempo Grep in un file?

  3. Come reindirizzare Stderr e Stdout su file diversi e visualizzarli anche nel terminale?

  4. Come reindirizzare l'output su un file e stdout

  5. È possibile rendere l'output di stdout e stderr di colori diversi in XTerm o Konsole?

Come reindirizzare stderr e stdout a file diversi nella stessa riga nello script?

Shell:reindirizza stdout a /dev/null e stderr a stdout

Ripristino di stdout e stderr al valore predefinito

Determina se l'output è stdout o stderr

Perché l'output di alcuni programmi Linux non va né a STDOUT né a STDERR?

Colore diverso per comando e output