2016-01-29 20 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, –