Bash:检查管道中的输入是否为空

enu*_*mag 6 bash

假设我有一个 bash 命令mycommand。有时它会向输出写入一些内容但总是返回退出代码 0。我需要使用管道将退出代码修复为 0 以表示空输出,而其他内容则表示非空输出。

mycommand | ???
Run Code Online (Sandbox Code Playgroud)

我对 ifs 或自定义命令不感兴趣。我只想要一个简单的命令,比如 grep 和一些参数来检查它的输入是否为空并返回退出代码。

如果输入不为空,则最好打印输入,但它不是强制性的。

l0b*_*0b0 6

wc支持换行符和\0

$ printf '\n' | wc -c
1
$ printf '\0' | wc -c
1
Run Code Online (Sandbox Code Playgroud)

所以这将是一个简单的 POSIX 兼容方法:

mycommand | [ $(wc -c) -eq 0 ]
Run Code Online (Sandbox Code Playgroud)

例子:

$ printf '' | [ $(wc -c) -eq 0 ]; echo $?
0
$ printf 'yay' | [ $(wc -c) -eq 0 ]; echo $?
1
$ printf '\n' | [ $(wc -c) -eq 0 ]; echo $?
1
$ printf '\0' | [ $(wc -c) -eq 0 ]; echo $?
1
Run Code Online (Sandbox Code Playgroud)

不起作用的替代方案:


F. *_*uri 5

也许:

yourcommand | grep -qv .
Run Code Online (Sandbox Code Playgroud)

! ( yourcommand |  grep -q ^ )
Run Code Online (Sandbox Code Playgroud)

或者相反的意思:如果没有返回则返回false

yourcommand |  grep -q ^ || echo no output.
Run Code Online (Sandbox Code Playgroud)