Come stampare l'errore standard in rosso


14

Come posso stampare l'errore standard in rosso nella console invece di usare lo stesso colore dell'output standard?

È possibile utilizzare Gnome Terminal ?


Questo link potrebbe aiutarti
devav2

È possibile abilitare questo comportamento per un comando utilizzando l' hiliteutilità . È necessario anteporre manualmente hiliteal comando shell per usarlo, ma è comunque utile se si conosce o si sospetta che un comando generi errori e si desideri localizzarli.
Rory O'Kane,

Risposte:


8

Uso stderred e l'ho trovata una buona soluzione. Come nota il suo readme :

Hook stderred su write () e una famiglia di funzioni stream (fwrite, fprintf, errore ...) da libc per colorare tutto l'output stderr che va al terminale rendendolo distinguibile da stdout. Fondamentalmente racchiude il testo che va al file con il descrittore "2" con i codici di escape ANSI corretti che rendono il testo rosso.

È implementato come libreria condivisa e non richiede la ricompilazione di file binari esistenti grazie alla funzione di precarico / inserimento dei linker dinamici.

È supportato su Linux (con LD_PRELOAD), FreeBSD (anche LD_PRELOAD) e OSX (con DYLD_INSERT_LIBRARIES).

È semplice da compilare, ma è necessario crearlo dal sorgente seguendo le istruzioni dal suo sito Github :

sudo apt-get install build-essential git cmake 

Poi

git clone git://github.com/sickill/stderred.git
cd stderred

Poi

make

La parte più importante è aggiungere la linea appropriata al tuo .bashrc; è necessario il collegamento al libstderred.sofile nella directory di generazione; è necessario utilizzare il percorso assoluto in cui si trova la directory di build (/ home / mike / src / stderred / build). Aggiungo quanto segue al mio .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Ovviamente, quando non vuoi più usarlo, rimuovi la linea sopra dalla tua .bashrce riavvia il terminale.

I risultati, testati su file inesistenti (ovviamente non funzionerà quando sudoviene utilizzato, in quanto l'utente .bashrcnon verrà letto quando viene impostato il diverso ambiente):

(A proposito, il mio duke @ nukem non diventa rosso perché era già rosso )

inserisci qui la descrizione dell'immagine


Non posso credere di essere passato così tanti anni senza sapere che questo esiste! È incredibilmente utile e dovrebbe essere stato parte del sistema operativo per, oh, un centinaio di anni ormai. :)
Roger Dahl,

6

In generale sì, poiché Gnome Terminal è un terminale ANSI e supporta i codici di escape ANSI standard.

Ecco un esempio Digita questo nel tuo terminale:

echo -e "\e[01;31mREDRUM\e[0m"

L' -eopzione consente di interpretare i codici di barra rovesciata, in modo che \ediventi "Esc" (codice esadecimale 0x1B). In alternativa, per entrare direttamente in escape, premere ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape ed [entrambi formano insieme il codice riconosciuto dal terminale. Dopo quella sequenza, è necessario inserire un ;elenco di attributi separato da due punti , terminato da m. Vedi qui per tutti i codici. Gli esempi includono l'attributo 0(resetta tutti gli attributi, come noterai sopra che è la sequenza che termina il mio esempio) e un mucchio di stile (sottolineato, luminoso, grassetto ecc.) Così come alcuni attributi di colore.

La risposta sopra ti dice come usare il colore quando scrivi il tuo programma.

Tuttavia, se capisco correttamente la tua domanda, ti piacerebbe avere una separazione visiva per stderr e stdout di tutti i programmi che stai eseguendo. Questo non è semplice senza analizzare il loro output attraverso un filtro. Ecco un esempio (trovato qui ) come farlo:

  1. Definisci una funzione (puoi inserirla nel tuo file .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Avvia programmi come questo:

    color program
    

Lo standard dei programmi verrà colorato in rosso.


c'è un modo per renderlo colorato qualsiasi messaggio err da qualsiasi programma?
Luca
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.