【发布时间】:2021-01-28 09:37:42
【问题描述】:
我有一个具有打印功能的 bash 脚本,如下所示:
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 var,它表示如果我的程序用-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 var 是1 并且命令运行错误(意思是$? != 0)它不会从print() 指令打印我的消息(如预期的那样),但它会从命令本身打印错误,例如,RTNETLINK answers: File exists。
理想情况下,我想要的不仅仅是使用 2> /dev/null 运行我的所有命令,因为错误消息可能很重要,但我想将它们重定向到我的类型为 2 的 print() 函数,所以它们会是仅当我的安静变量为 0 时才打印在 stderr 上。好像我用2> $(print 2 "RTNETLINK answers: File exists") 运行了一个程序,尽管我知道这不会从那时起。
我想过做类似的事情:
ip link add "${interface}" 2> /var/tmp/myprog.output || print 2 $(cat /var/tmp/myprog.output)
但是 1) 我不想为此使用文件系统,并且 2) 必须有更优雅的方式。
有什么想法吗?
【问题讨论】:
标签: bash function redirect stderr