有没有一个简单的实用程序可以在 Linux 上通过管道输出:
- 如果标准输出(和/或标准错误)上没有输出,则返回成功代码。
- 如果输出是在标准输出(和/或标准错误)上生成的,则返回失败代码。
为了提供一些上下文,我运行的命令是:
svn mergeinfo --show-revs eligible
http://mysvnserver.example.com/SVF/repos/common/abc/branches/abc-1.7
http://mysvnserver.example.com/SVF/repos/common/abc/trunk
如果分支上有任何未合并的条目,该命令将在标准输出上返回修订号列表。理想情况下,我所说的附加命令是:
- 检测标准输出上的条目并向 Linux 返回错误条件。
- 传递标准输出,以便它最终出现在终端上。我宁愿不压抑它。
答案1
这就是grep
您正在寻找的:
if svn ... 2>&1 | grep '^'; then
echo "there was some output"
else
echo "there wasn't"
fi
您可以替换grep '^'
为grep .
或grep '[^[:blank:]]'
来检查非空行或非空白行(但这将从输出中删除空/空白行)。
grep
(请注意,如果输入包含非文本数据,例如 NUL 字节或太长或未终止的行(但这不会发生svn
),则不同实现的行为会有所不同)。
答案2
我不知道现有的命令...是自己动手的命令不可接受吗?包装纸?将输出写入文件并根据文件是否为空退出?
包装方法,假设您仍然希望查看输出并在输出中将 stdout 和 stderr 分开。
#!/bin/bash
TMPFILE=/tmp/allout.$$
TMPPIPE=/tmp/errout.$$
SAVERC=/tmp/saverc.$$
cleanup() {
[ -p $TMPPIPE ] && rm $TMPPIPE
[ -f $TMPFILE ] && rm $TMPFILE
}
trap cleanup EXIT
# Set up output/display of std err
[ -p $TMPPIPE ] || mkfifo $TMPPIPE
cat $TMPPIPE | tee -a $TMPFILE1 >&2 &
(eval "$*" 2>$TMPPIPE
echo $? > $SAVERC
) | tee -a $TMPFILE
[ -s $TMPFILE ] && exit 1
exit $(cat $SAVERC)
答案3
您可以使用wc
它来计算输出中的字符数。
$ [ $(ls 2>&1 | wc -c) = "0" ]
$ echo $?
1
$ [ $(echo -n '' 2>&1 | wc -c) = "0" ]
$ echo $?
0
需要2>&1
将 stderr 重定向到 stdout。