2016-01-29 99 views
2

pngcheck几乎完美。但以最简单的形式,pngcheck输出一行从OK:ERROR:开始的行。这意味着我必须解析一个输出字符串,我宁愿只检查一个返回值。易于使用bash/linux来检查PNG是否有效?

我查看了pngcheck.c源代码,并且对PNG有效性进行全面检查相当麻烦 - 不仅仅是一个幻数检查。所以我现在可以做的最好的是创建一个简单的pngcheck.sh,它调用pngcheck并分析输出字符串,然后相应地跟着exit 0exit 1

但我想检查是否有一个简单或更''bashonic'的解决方案。

谢谢!

+1

你有源码,为什么不只是修改它来退出0或1的有效/无效并重新编译?运行'pngcheck'后运行'$?'的 – chepner

+0

不起作用?对不起,只是想确保我完全理解。 – bluerojo

+1

'if [[$(pngcheck command | grep -c ERROR)!=“0”)如何?然后回显“PNG无效”; fi'为单线? – bluerojo

回答

3

当我看着pngcheck.c的源代码(PNGcheck,7 2.3.0版2007年7月),我相信它确实设置返回码。附近的main()的末尾:

717 if (num_errors > 0) 
718  err = (num_errors > 127)? 127 : (num_errors < 2)? 2 : num_errors; 
719 else if (num_warnings > 0) 
720  err = 1; 
... 

NUM_ERRORS是失败的,NUM_WARNINGS是有一个警告的文件数的文件数量。然后以“return err”退出;

因此,所有ok的返回代码为0,仅针对警告1,而2或更高的返回码是失败的文件数(最大127)。

这也与我在Ubuntu上安装的二进制文件的小测试一致。

pngcheck -q /etc/profile >/dev/null; echo $? # returns 2 
pngcheck -q cpu50.png >/dev/null; echo $?  # returns 0 
+0

非常感谢!我通过Arkadiusz Drabczyk's接受了这个答案,因为这个答案使用了'-q'标志,再加上来自不同状态代码的源代码的细节很好。我猜'pngcheck'返回2即使只有一个文件失败,但没关系。 –

4

查看源代码后,我认为您可以使用$? 在许多shell中保存上一个命令的退出状态。请参阅 行4684在pngcheck.c中打印成功消息。如果有 错误global_error将不会被设置为0,并且将被传递给 返回main()。事情现在得到简单:

#!/usr/bin/env sh 

if pngcheck "$1" > /dev/null 2>&1 
then 
    echo things went ok 
else 
    echo things went bad 
fi 

用法:

$ ./check-png.sh /usr/share/icons/HighContrast/22x22/status/touchpad-disabled.png 
things went ok 
$ ./check-png.sh /tmp/FILE 
things went bad 
+0

它看起来像'pngcheck'有'-q'选项是安静的。不幸的是,它可能并不完全安静。 –

+0

似乎'-q'只能抑制'stdout'而不是'stderr',但我没有检查代码。 –

+0

谢谢!除了打印错误消息之外,我不会想到会设置状态码。我猜这是一个常见的bash/* nix成语 - 要返回一个状态码,还要打印一些文本,如果不需要,总是可以重定向到/ dev/null, –