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.
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)
#!/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)
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)
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)
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)
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)
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
LEARN ABOUT CENTOS
systemd-cat
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 208SYSTEMD-CAT(1)