Sponsored Content
Top Forums UNIX for Advanced & Expert Users How to set font color for STDIN,STDOUT and STDERR? Post 302542402 by Corona688 on Wednesday 27th of July 2011 12:27:16 PM
Old 07-27-2011
The terminal can't tell what's printing to standard output vs standard error -- they both go to literally the same file. You could intercept standard error with a fifo and process it...
Code:
#!/bin/bash

# On exit, close stderr and delete the fifo so we don't leave dangling background processes.
trap "exec 2<&- ; rm ~/.tmpfifo" EXIT

rm -f ~/.tmpfifo

mkfifo ~/.tmpfifo
# Create a subshell that reads from fifo, writes to stderr.
# it gets its own copy of stderr, so redirecting stderr later won't change this.
(       while read LINE
        do
                printf "\x1b[01;31m%s\x1b[01;m\n" "$LINE"
        done < ~/.tmpfifo ) &

exec 2>~/.tmpfifo

# Thing that should print standard error in red
touch /

Code:
$ ./errfilter.sh
touch: setting times of `/': Permission denied
$

This only works for scripts, not for interactive terminals, because bash frequently uses stderr for its own things when in interactive mode.

---------- Post updated at 10:27 AM ---------- Previous update was at 10:11 AM ----------

Actually, here's a way that'll work in interactive mode:

Code:
trap "exec 5>~/.tmpfifo-$$ ; rm -f ~/.tmpfifo-$$ ; exec 5<&-" EXIT

mkfifo ~/.tmpfifo-$$

(       while [ -e ~/.tmpfifo-$$ ]
        do
                while read LINE
                do
                        printf "\x1b[01;31m%s\x1b[01;m\n" "$LINE"
                done < ~/.tmpfifo-$$ >&2
        done
 ) &

function err
{
        "$@" 2>/.tmpfifo-$$
}

Do this in your shell:
Code:
$ source errfilter.sh
$ err touch /
touch: setting times of `/': Permission denied
$

and any commands you run with err will have stderr color-coded.
This User Gave Thanks to Corona688 For This Post:
 

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Redirect stdout and stderr

How can I redirect and append stdout and stderr to a file when using cron? Here is my crontab file: */5 * * * * /dir/php /dir/process_fns.php >>& /dir/dump.txt Cron gives me an 'unexpected character found in line' when trying to add my crontab file. Regards, Zach Curtis POPULUS (8 Replies)
Discussion started by: zcurtis
8 Replies

2. Shell Programming and Scripting

precedence of stderr and stdout

#!/usr/bin/perl open(STDOUT, ">>$Textfile") open(STDERR, ">>$Textfile") print "program running\n"; $final = join("+", $initial,$final) #5 close (STDOUT); close (STDERR);Hi all, above is my perl code. Notice i have captured the stdout and stderr to the same textfile. my code is expected to... (1 Reply)
Discussion started by: new2ss
1 Replies

3. Programming

stdout/stdin + flushing buffers

Hi all I've run into a snag in a program of mine where part of what I entered in at the start of run-time, instead of the current value within printf() is being printed out. After failing with fflush() and setbuf(), I tried the following approach void BufferFlusher() { int in=0;... (9 Replies)
Discussion started by: JamesGoh
9 Replies

4. Shell Programming and Scripting

How to use tee with stdout and stderr?

I have been doing this: make xyz &> xyz.log &; tail -f xyz.log The problem with this is that you never can ge sure when "make xyz" is done. How can I pipe both stderr and stdout into tee so both stderr and stdout are copied both to the display and to the log file? Thanks, Siegfried (3 Replies)
Discussion started by: siegfried
3 Replies

5. Shell Programming and Scripting

can't close stdin/stdout in shell

#!/bin/sh exec 0</dev/null exec 1>/dev/null ls -l /proc/self/fd >&2 produces total 0 lr-x------ 1 tyler users 64 Feb 18 10:38 0 -> /proc/7886/fd lrwx------ 1 tyler users 64 Feb 18 10:38 1 -> /dev/pts/4 lrwx------ 1 tyler users 64 Feb 18 10:38 2 -> /dev/pts/4 I've verified the shell is... (10 Replies)
Discussion started by: Corona688
10 Replies

6. Shell Programming and Scripting

stderr/stdout

Can somebody explain to me why the diff output is not going to stderr? Yet when I issue a diff from the command line the return code is -ne 1. I am guessing diff always writes to stdout??? Is there away I can force the difff to write to stderr USING THE CURRENT template. If possible, I... (5 Replies)
Discussion started by: BeefStu
5 Replies

7. UNIX for Dummies Questions & Answers

STDIN and STDOUT

Hallo, i have a script like: if ;then echo "OK" else echo "ERROR $2 is missing" fi; if ;then touch $2 fi; if ;then cat $1 | grep xy > $2 (1 Reply)
Discussion started by: eightball
1 Replies

8. Shell Programming and Scripting

stdout, stderr redirection

Hi all, can someone help me with the next redirection? i want to redirect the stdout+stderr of a command to the same file (this i can do by prog &> file) but in addition i want to redirect only the stderr to a different file. how can i do this please? (in BASH) thanks. (4 Replies)
Discussion started by: eee
4 Replies

9. Shell Programming and Scripting

Redirect string from bash stderr to user stdin

Hi there, I need to execute a command in the bash. The program prints some standard (output and) error and then wants the user to choose one of several options and type the according input. I am trying to solve this issue in a bash script but also running into some circular dependency. How can I... (7 Replies)
Discussion started by: fredestet
7 Replies
SYSTEMD-CAT(1)							    systemd-cat 						    SYSTEMD-CAT(1)

NAME
systemd-cat - Connect a pipeline or program's output with the journal SYNOPSIS
systemd-cat [OPTIONS...] [COMMAND] [ARGUMENTS...] systemd-cat [OPTIONS...] DESCRIPTION
systemd-cat may be used to connect STDOUT and STDERR of a process with the journal, or as a filter tool in a shell pipeline to pass the output the previous pipeline element generates to the journal. If no parameter is passed, systemd-cat will write everything it reads from standard input (STDIN) to the journal. If parameters are passed, they are executed as command line with standard output (STDOUT) and standard error output (STDERR) connected to the journal, so that all it writes is stored in the journal. OPTIONS
The following options are understood: -h, --help Prints a short help text and exits. --version Prints a short version string and exits. -t, --identifier= Specify a short string that is used to identify the logging tool. If not specified, no identification string is written to the journal. -p, --priority= Specify the default priority level for the logged messages. Pass one of "emerg", "alert", "crit", "err", "warning", "notice", "info", "debug", or a value between 0 and 7 (corresponding to the same named levels). These priority values are the same as defined by syslog(3). Defaults to "info". Note that this simply controls the default, individual lines may be logged with different levels if they are prefixed accordingly. For details see --level-prefix= below. --level-prefix= Controls whether lines read are parsed for syslog priority level prefixes. If enabled (the default), a line prefixed with a priority prefix such as "<5>" is logged at priority 5 ("notice"), and similar for the other priority levels. Takes a boolean argument. EXIT STATUS
On success, 0 is returned, a non-zero failure code otherwise. EXAMPLES
Example 1. Invoke a program This calls /bin/ls with STDOUT/STDERR connected to the journal: # systemd-cat ls Example 2. Usage in a shell pipeline This builds a shell pipeline also invoking /bin/ls and writes the output it generates to the journal: # ls | systemd-cat Even though the two examples have very similar effects the first is preferable since only one process is running at a time, and both STDOUT and STDERR are captured while in the second example only STDOUT is captured. SEE ALSO
systemd(1), systemctl(1), logger(1) systemd 208 SYSTEMD-CAT(1)
All times are GMT -4. The time now is 08:43 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy