问题描述
print(){
[ $quiet == 1 ] && return
type=$1; shift
message="$*"; shift $#
# shellcheck disable=SC2086
if [ $type -eq 1 ]; then
echo "$message"
else
>&2 echo "$message"
fi
}
简而言之,它接收2个参数,第一个是类型,如果为1,它将在屏幕上显示消息(stdout),否则(在这种情况下为2)将在stderr
上显示消息。 。另外,我有一个quiet
变量,它表示如果用-q
调用我的程序,则无论其stdout
还是stderr
(该函数返回)。
问题是在我运行程序的整个程序中,我或多或少地像下面那样运行它们:
ip link add "${interface}" &&
print 1 " interface ${interface} added successfuly." ||
{ print 2 " interface ${interface} Could not be added."; return 1; }
如果命令运行没有错误(意思是$? == 0
),但是如果我的quiet
变量是1
,并且命令运行有错误(意思是{ {1}})(它不会打印来自$? != 0
指令的消息(按预期),但是会打印来自命令本身的错误,例如print()
。
理想情况下,由于错误消息可能很重要,所以我不希望仅使用RTNETLINK answers: File exists
运行所有命令,而是想将它们重定向到类型为2的2> /dev/null
函数中因此只有我的安静变量为print()
时,它们才会打印在stderr
上。好像我用0
运行了一个程序一样,即使我知道从那以后也不行了。
我考虑过要做类似的事情:
2> $(print 2 "RTNETLINK answers: File exists")
但是1)我不希望为此使用文件系统,并且2)必须有更优雅的方式。
有什么想法吗?
解决方法
您可以capture the stderr
of the command并将其传递给print
。
print 2 "$(ip link add '${interface}' 2>&1 > /dev/null)"