【问题标题】:In bash, how to redirect the stderr of a command inside the script to the stderr of the script itself?在bash中,如何将脚本内命令的stderr重定向到脚本本身的stderr?
【发布时间】: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


    【解决方案1】:

    您可以将capture the stderr of the command 传递给print

    print 2 "$(ip link add '${interface}' 2>&1 > /dev/null)"

    【讨论】:

    • 但是您正在将 stdout 和 stderr 重定向到 null 并且不向 print() 传递任何内容。没有?
    • @Adriano_Pinaffo 这应该捕获stderr,将其重定向为stdout,并将原始stdout 定向到/dev/null
    • 但在这种情况下,我总是将打印参数作为 2 传递...但是当程序出错时应该只有两个
    • 该死的,也许我将不得不运行命令并将 stdout 重定向到 output.stdout 文件和 stderr 到 output.stderr 文件并打印不为空的任何内容
    猜你喜欢
    • 2010-10-01
    • 2021-08-19
    • 2021-01-13
    • 1970-01-01
    • 2012-03-09
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多