在bash中,如何将脚本内命令的stderr重定向到脚本本身的stderr?

问题描述

我有一个具有打印功能的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变量,它表示如果用-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)"