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

时间:2017-03-19 07:50:38

标签: bash

我们说我有一个bash命令mycommand。有时它会输出一些内容但总是返回退出代码0.我需要使用管道将退出代码修复为0表示空输出,其他表示非空输出。

mycommand | ???

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

如果输入不是空的,它应该打印输入,但它不是强制性的。

5 个答案:

答案 0 :(得分:2)

也许:

yourcommand | grep -qv .

! ( yourcommand |  grep -q ^ )

或反义:如果没有返回,则返回 false

yourcommand |  grep -q ^ || echo no output.

答案 1 :(得分:1)

wc支持换行符和\0

$ printf '\n' | wc -c
1
$ printf '\0' | wc -c
1

所以这将是一种简单的POSIX兼容方式:

mycommand | [ $(wc -c) -eq 0 ]

示例:

$ 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

工作的替代方案:

  • grep .不匹配单独的换行符或\0作为字符:

    $ printf '\n' | grep .; echo $?
    1
    $ printf '\0' | grep .; echo $?
    1
    
  • 您无法将\0保存在变量中:

    $ a=$'foo\0bar\0baz'
    $ printf '%s' "$a" | wc -c
    3
    
  • Command substitutions删除尾随换行符:

    $ test -z "$(printf '\n')"; echo $?
    0
    

答案 2 :(得分:0)

一种常见但稍微不优雅的解决方法是使用临时文件。

t=$(mktemp -t myscript.XXXXXXXX) || exit
# Use a trap to clean up even if interrupted
trap 'rm -f "$t"' EXIT
trap 'exit' HUP TERM
cat >"$t"
if [ -s "$t" ]; then
    : do stuff with "$t"
fi

这显然太复杂了,无法在命令行上随便使用,但有时你只需编写一个脚本。

这很好地概括了你需要在所有输入上执行多个命令的任何情况。

我也会顺便注意xargs -r当然只有在你已经xargs的情况下才有意义。

答案 3 :(得分:0)

因为有很多不同的答案 - 所以grep使用^

pp() { printf "================\nfor: %s\n" "$@"; }

pp "no input"
printf '' | grep -q ^ ; echo $?
printf '' | grep -q ^ && echo got input || echo no input

pp 'null character'
printf '\0' | grep -q ^ ; echo $?
printf '\0' | grep -q ^ && echo got input || echo no input

pp '\n'
printf '\n' | grep -q ^ ; echo $?
printf '\n' | grep -q ^ && echo got input || echo no input

pp 'some'
printf 'some' | grep -q ^ ; echo $?
printf 'some' | grep -q ^ && echo got input || echo no input

pp 'some\n'
printf 'some\n' | grep -q ^ ; echo $?
printf 'some' | grep -q ^ && echo got input || echo no input

输出

================
for: no input
1
no input
================
for: null character
0
got input
================
for: \n
0
got input
================
for: some
0
got input
================
for: some\n
0
got input

答案 4 :(得分:0)

似乎最干净的方法是

mycommand | ( ! grep ^ )