如何过滤进程输出,同时保留其退出状态

如何过滤进程输出,同时保留其退出状态

我的安装文件中有一个简单的小 shell 函数,它调用参数中提供的命令行并在失败时调用标准退出。

function my_exec() {
  if [ "$1" != "" ]; then
    $*                       # WANT FILTER HERE
    my_test $? $*
  fi
}
function my_test() {
  if [ $1 -ne 0 ]; then
    ecval=$1
    shift
    if [ "$1" !- "" ]; then
      my_exit "Exited with error $ecval from $*"
    else
      my_exit "Exited with error $ecval"
    fi
  fi
}
function my_exit() {
  echo "ERROR: " $* 2>&1
  if [ `basename $0`  = "go.sub.sh" ]; then
    echo "ERROR" > go.sub.${occ}.done
  fi
  exit 1
}

该函数执行的进程之一会生成大量我想要过滤的输出。

如果可以的话,我想用与此等效的内容替换标记为 WANT FILTER HERE 的行(实际过滤器将取决于命令 $1 的值):

$* | grep -v "^INFO:" | grep -v "^NOTE:"

但这当然颠覆了 $? 的测试接下来。有没有办法过滤命令输出而不丢失命令退出代码?我不希望将所有输​​出重定向到文件、保存状态并反向 grep 文件,尤其是因为用户可能会实时观察此作业的运行情况以了解其进展情况。

谢谢,T

答案1

bashPIPESTATUS数组保存管道中所有命令的状态代码。

对于第一个程序的退出代码:

echo "${PIPESTATUS[0]}"

通过管道连接在一起的所有程序的退出代码:

echo "${PIPESTATUS[@]}"

相关内容