如果产生任何标准输出,Linux 命令行将会失败

如果产生任何标准输出,Linux 命令行将会失败

有没有一个简单的实用程序可以在 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。

相关内容