如何在POSIX shell中测试命令输出是否为非空?

时间:2013-06-28 00:12:45

标签: bash shell unix testing

如何有效地检查任意命令是否在POSIX shell中产生任何输出? (假设 git ls-files --killed 。)

有三种显而易见的方式,但每种方式对我来说都是丑陋或邪恶的:

  1. [-n“$(git ls-files --killed)”] - 必须在内存中捕获命令的完整输出并传递给 test (至少希望是内置的)
  2. [“$(git ls-files --killed | wc -c)” - gt 0] - 两名叉子执行官
  3. TMP = $(临时文件); git ls-files --killed>“$ tempfile”; [-s“$ tempfile”]&& ...; rm“$ tempfile” - 需要一个中间临时文件(再次捕获所有输出)

4 个答案:

答案 0 :(得分:4)

您也可以检查命令的退出状态。通常,如果成功运行命令,则返回退出状态0。

git ls-files --killed > /dev/null
if [ $? -eq 0 ]

或者如果您只想依赖命令的输出,可以使用“head -1”和第一个选项,因为无论如何它看起来除了知道之外你没有使用命令输出进行任何处理结果。

答案 1 :(得分:3)

我首选的解决方案使用内置read

的POSIX shell
def cube(number):
    return number * number

def by_three(number):
    if number % 3 == 0:
        print("{} is divisible by 3".format(number))
        return cube(number)
    else:
        print("Nope")
        return False

def main():
    by_three(3)
    by_three(4)

if __name__ == "__main__": main()

if git ls-files --killed | read REPLY; then echo "Some output" else echo "No output or git failed" fi 尝试从stdin读取一行(并进入变量read),如果成功则返回0,如果失败则返回正退出代码。管道的其余部分未读取。仅在bash中,REPLY是默认名称(如果省略),因此REPLY可以缩短为read REPLY

这种方法的一个潜在缺点是,不会检查相关程序的退出代码(在您的示例中为git)。

答案 2 :(得分:1)

您可能认为此解决方案与其他解决方案一样,但我认为它使用的内存少于其他解决方案(我不是shell脚本效率方面的专家)。

代码仅限bash:

z=0
while read -r -n1 char; do
  z=1
  break
done < <(git ls-files --killed)
[ $z != 0 ]

它使用临时变量而不是临时文件,我认为read一次只能运行一个char,但git ls-files命令仍然可以完全执行。

它可能不会那么难看,但我认为它可能至少更有效率。

答案 3 :(得分:-1)

因为你提到了POSIX,我会推荐你​​这个answer
我会使用/ usr / bin / test,因为它在POSIX系统上是必需的。

/usr/bin/test -n "$(git ls-files --killed)"