我有一个以几个管道结尾的 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。