首页 文章

如果管道输出为空,则生成其他退出行为

提问于
浏览
2

我有一个bash shell脚本做某事

#!/bin/bash
# construct regex from input
# set FILE according to input file
egrep "${regex}" "${FILE}" | doing stuff | sort

我希望这个脚本将命令的输出(一个新行分隔的匹配列表)写入stdout,如果找到匹配(它正在做) . 如果未找到匹配项,则需要向stderr写出错误消息并退出并退出状态3 .

我试过这个

#!/bin/bash
# construct regex from input
# set FILE according to input file
function check () {
  if ! read > /dev/null
    then
      echo "error message" 1>&2
      exit 3
  fi
}
egrep "${regex}" "${FILE}" | doing stuff |
sort | tee >(check)

现在写出正确的错误消息,但退出状态“无法转义子shell”;外部脚本仍然以退出状态0退出 .

我也试过......

#!/bin/bash
# construct regex from input
# set FILE according to input file
if ! egrep "${regex}" "${FILE}" | doing stuff | sort
then
  echo "error message" 1>&2
  exit 3
fi

但在这里我遇到的问题是管道中的一个命令(特别是排序)以退出状态0退出

如何在保持输出正常执行并且不执行所有内容两次的情况下获得所需的退出状态3和错误消息?

编辑:我可以通过使用来解决问题

#!/bin/bash
# construct regex from input
# set FILE according to input file
if ! egrep "${regex}" "${FILE}" | doing stuff | sort | grep . 
then
  echo "error message" 1>&2
  exit 3
fi

但是我不确定这是最好的方法,因为管道并行工作......

1 回答

  • 0

    我会使用PIPESTATUS来检查egrep的退出代码:

    #!/bin/bash
    # construct regex from input
    # set FILE according to input file
    egrep "${regex}" "${FILE}" | doing stuff | sort
    if [[ ${PIPESTATUS[0] != 0 ]]; then
      echo "error message" 1>&2
      exit 3
    fi
    

    一些背景:

    ${PIPESTATUS[@]} 只是一个数组,其中包含您链接的每个程序的退出代码 . $? 将只提供管道中最后一个命令的退出代码 .

相关问题