views:

593

answers:

4

Is it even achievable?

We need STDERR (ie. other streams then STDOUT) to have different colo(u)r. For example red.

We use bash, terminal should be Konsole (XTerm, gnome terminal or any usable).

Thanks if you know :-)

+2  A: 

I think you should use the standard escape sequences on stderr. Have a look at this.

Matteo Italia
+3  A: 

Here is a little Awk script that will print everything you pass it in red.

#! /usr/bin/awk -f
{printf("%c[%dm%s%c[0m\n",0x1B,31,$0,0x1B);fflush()}

It simply prints each line it receives on stdin within the necessary escape codes to display it in red. It is followed by an escape code to reset the terminal.

(If you need a different colour, change the 31)

Save it to colr.awk, do a chmod a+x, and use it like so:

$ my_program | ./colr.awk

It has the drawback that lines may not be displayed in order, because stderr goes directly to the console, while stdout first goes through an additional process.

iWerner
There's no guarantee that stdout and stderr will appear in order anyway. They're separate pipes with separate buffering, and stdout is usually buffered in the process memory as well.
Andy Ross
+2  A: 

I can't see that there is any way for the terminal emulator to do this.

The interface between the terminal emulator and the shell/app is via a pseudo-tty, where the terminal emulator is on the master side and the shell/app on the other. The shell/app have both stdout and stderr connected to the same pty, so when the terminal emulator reads from the pty for the shell/app output it can no longer tell which was written to stdout and which to stderr.

You will have to use one of the solutions that intercepts the data between the application and the slave-pty and inserts escape codes to control the terminal output colo(u)r.

camh
+2  A: 

Hilite will do this. It's a lightweight solution, but you have to invoke it for each command, eg. hilite gcc myprog.c. A more radical approach is built in to my experimental shell Gush which shows stderr from all commands run in red, stdout in black. Either way is very useful for software builds where you have lots of output with a few error messages that could easily be missed if not highlighted.

Colin Macleod