假设我有一个 bash 命令mycommand。有时它会向输出写入一些内容但总是返回退出代码 0。我需要使用管道将退出代码修复为 0 以表示空输出,而其他内容则表示非空输出。
mycommand | ???
Run Code Online (Sandbox Code Playgroud)
我对 ifs 或自定义命令不感兴趣。我只想要一个简单的命令,比如 grep 和一些参数来检查它的输入是否为空并返回退出代码。
如果输入不为空,则最好打印输入,但它不是强制性的。
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)
不起作用的替代方案:
grep .不匹配单独的换行符或\0字符:
$ printf '\n' | grep .; echo $?
1
$ printf '\0' | grep .; echo $?
1
Run Code Online (Sandbox Code Playgroud)您不能保存\0在变量中:
$ a=$'foo\0bar\0baz'
$ printf '%s' "$a" | wc -c
3
Run Code Online (Sandbox Code Playgroud)命令替换删除尾随换行符:
$ test -z "$(printf '\n')"; echo $?
0
Run Code Online (Sandbox Code Playgroud)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)
| 归档时间: |
|
| 查看次数: |
7048 次 |
| 最近记录: |