首页 > 解决方案 > 在不消耗数据的情况下测试输入流是否为空

问题描述

考虑下一个片段。

generate_build_specs(){
  echo ubuntu gcc9 debug
  echo macos clang debug
  echo macos gcc10 release
  echo macos clang release
}
generate_build_specs | awk -v IGNORECASE=1 '/macos/ && /release/' |
  if input_data_available ;then
      echo "FIXME. Cannot build 'macos release' until it is fixed. Buildspec dropped: $(cat)"
  fi

我的想法是仅当流中的数据可用时才使用输入流的内容回显消息。像peek(char)流中的东西,而不是从那里拿走它。

当然,我知道一种解决方法。IE

var="$(cat)"; if test -n "$var"; echo "blah:: $var" ; fi

标签: bashshellgrepcat

解决方案


不完全符合您的要求,但对于您的情况,功能等效:

if generate_build_specs | awk -v IGNORECASE=1 '/macos/ && /release/' | grep -q .
then
  echo No data produced
fi

如果我们很挑剔,我们应该指出,如果管道产生的数据只包含空行,这也会导致没有数据产生

如果你真的有你发布的那个 awk 命令(这里没有显示一个简化版本来解释你的观点),你也许也写了

if generate_build_specs | grep -i macos | grep -iqv 'release'
then
  ..echo "No data produced which contains the strings 'macos' and 'release'"
fi

这意味着字符串macos必须在一行中出现在字符串之前release。由于我不知道预期输出的generate_builds_specs外观如何,我不能说这种方法是否适用于您的情况。


推荐阅读