I have a bash script that has a print function, like this:
print(){
[ $quiet == 1 ] && return
type=$1; shift
message="$*"; shift $#
# shellcheck disable=SC2086
if [ $type -eq 1 ]; then
echo "$message"
else
>&2 echo "$message"
fi
}
In a nutshell it receives 2 parameters, the first is the type, if 1 it will print the message on the screen (stdout), else (in that case 2) it will print the message on the stderr
. Also, I have a quiet
var that says that if my program is called with -q
, it will not print anything on the screen whether its stdout
or stderr
(the function returns).
The problem is that throughout my program when I run commands, I run them more or less like below:
ip link add "${interface}" &&
print 1 " interface ${interface} added successfuly." ||
{ print 2 " interface ${interface} could not be added."; return 1; }
It works fine (success message is printed) if the command runs without error (meaning $? == 0
) but if my quiet
var is 1
and the command runs with error (meaning $? != 0
) it will not print my message from the print()
instruction (as expected), but it will print the error from the command itself, for example, RTNETLINK answers: File exists
.
Ideally, what I wanted was to not just run all my commands with 2> /dev/null
since the error messages can be important, but I would like to redirect them to my print()
function with the type 2, so they would be printed on stderr
only if my quiet var is 0
. As if I ran a program with 2> $(print 2 "RTNETLINK answers: File exists")
even though I know that this doesn't make since.
I thought about doing something like:
ip link add "${interface}" 2> /var/tmp/myprog.output || print 2 $(cat /var/tmp/myprog.output)
But 1) I would prefer not to use the filesystem for that and 2) there must be a more elegant way.
Any ideas?