如果命令输出为空而不捕获它,则返回 1

如果命令输出为空而不捕获它,则返回 1

我有一个以几个管道结尾的 shell 脚本grep ... | while read ...| sort | uniq,如果输出为空,我想返回 1,但即使输入为空,uniq 也总是返回 0。

到目前为止,我发现的最好的解决方案是添加带有空模式的 grep ... uniq | grep '',这工作完美,但感觉更像是一个黑客。

所以我的问题是:有没有更好/规范的方法来做到这一点?

一些限制:

  • 我不想在变量中捕获我的输出,因为之后我需要再次打印它:a=$(... | uniq); printf '%s\n' "$a"; [ -n "$a" ]这也感觉不对。
  • 如果可能的话,我还更喜欢标准工具(没有更多实用程序)和便携式工具

谢谢!

答案1

坦白说,我觉得| grep ''还好。您已经在管道中使用了一堆程序,因此再开发一个程序不会有什么坏处。而且您已经知道它的grep作用,因此无需编写一些“智能”shell 片段来执行此操作。

评论也提到了| grep .,这可能是另一种可能性。grep .不匹配空行,grep ''但会匹配,因此请根据您想要的进行选择。

不过,对于普通读者来说,这样的使用grep可能不会立即显而易见,因此无论如何您可能需要添加有关其用途的注释。

答案2

我认为这应该可以完成工作:

[ -n "$(command | tee /dev/tty)" ]

tee会将command的输出发送到 stdout(由命令计算test)和终端 ( /dev/tty),这样您就可以看到输出,而无需将其捕获到变量中。

这是一个符合 POSIX 标准的解决方案 AFAIK。

相关内容