考虑下一个片段。
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),而不是从那里拿走的。
当然,我知道一个解决办法。i.e
var="$(cat)"; if test -n "$var"; echo "blah:: $var" ; fi发布于 2021-08-21 10:58:19
在讨论中,我意识到
,如果没有读取至少一个字符,就无法检查流是否结束。
input_data_available不能在Bash中实现。这是一个关于流的概念性问题。
因此,当前的解决方案是将输入存储到变量,然后处理它。
var="$(cat)"; if test -n "$var"; then echo "::ERROR:: $var" ; fi另一种更好的(即简洁的)方法是:
sed -zE 's,^.+$,::ERROR:: \0\n,'这意味着只有在输入不是空的情况下,才会增加字符串和输出。Regexp ^.+$检查是否至少有一个符号。但我认为,作为所有的单身汉,这是一个更难读。
谢谢大家的参与。
发布于 2021-08-19 09:29:15
这并不完全是您所要求的,但是对于您的情况而言,在功能上是相当的:
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的预期输出是什么样子,所以我不能说这种方法在您的情况下是否有效。
发布于 2021-08-19 18:44:53
你不需要冲向溪流。只需将输出存储在变量中即可。
buildspec=$(generate_build_specs | awk -v IGNORECASE=1 '/macos/ && /release/')
if [[ -n "${buildspec}" ]]; then
printf "%s\n" "FIXME. Cannot build 'macos release' until it is fixed." \
"Buildspec dropped:" "${buildspec}"
fi我使用printf来获取您可能需要的新行,您也可以使用echo 3次。
https://stackoverflow.com/questions/68845115
复制相似问题