2016-08-22 87 views
0

我已閱讀this,這表明以下編譯檢查:檢查返回值++

installCheck() { 
    if g++ check_opencv.cpp -o check_opencv; then 
    return 1 
    else 
    rm check_opencv 
    return 0 
    fi 
} 

if installCheck $0; then 
    echo "OpenCV already installed, skipping" 
    exit 0 
fi 

然而,運行此腳本給:

check_opencv.cpp:2:33: fatal error: opencv2/core/core.hpp: No such file or directory 
compilation terminated. 
rm: check_opencv: No such file or directory 
OpenCV already installed, skipping 

這是不對的。後來我改成這樣:

installCheck() { 
    g++ check_opencv.cpp -o check_opencv 
    if [[ $? -ne 0 ]]; then 

,它工作正常:

check_opencv.cpp:2:33: fatal error: opencv2/core/core.hpp: No such file or directory 
compilation terminated. 
Cloning into 'opencv-2.4.9'... 

這是爲什麼?由於[[g++的某些行爲?

this中的某人說:「可悲的是,事實證明退貨0天氣或不會失敗。」 g++不應該在它失敗時總是返回非零值?也許我想念一些明顯的東西,所以請爲我澄清。非常感謝你!

更新:事實證明我錯誤地理解了bash。返回值0在bash中評估爲true,這與我之前的想法相矛盾。 This有幫助。

回答

3
if g++ check_opencv.cpp -o check_opencv; then 
    return 1 

將返回失敗(1)如果編譯成功。顯然,你想返回失敗,如果編譯失敗,這將是:

if ! g++ check_opencv.cpp -o check_opencv; then 
    return 1 

或者你可以只把真假分支以正確的順序:

installCheck() { 
    if g++ check_opencv.cpp -o check_opencv; then 
    rm check_opencv 
    return 0 
    else 
    return 1 
    fi 
} 

我沒有看到鏈接問題中的任何地方提示您提出的代碼。

我想你的目的是爲了避免污染文件系統,如果編譯成功,因爲編譯本身是唯一需要的測試。你也可以用實現這一目標:

installCheck() { 
    g++ check_opencv.cpp -o check_opencv 
    local rv=$? 
    rm -f check_opencv 
    return rv 
} 
+0

是什麼?「如果[之間的區別! $(g ++ check_opencv.cpp -o check_opencv)]];然後「和」if!g ++ check_opencv.cpp -o check_opencv; then「?當opencv已經安裝時,後者不起作用。謝謝! –

+0

@雲生白:他們是完全不同的東西。第一個不是很有意義:如果'g ++'命令不會將任何內容輸出到'stdout'(這是正常的,因爲'g ++'通常會將錯誤輸出到'stderr')。第二個測試'g ++'是否返回失敗碼。你需要更清楚地說明「後者不起作用」的含義。 – rici

+0

謝謝!我對bash編程完全陌生,我會學習它。 –

0

if cmd; ...是「真」,如果CMD是CMD的成功即退出狀態是0 - 這是邏輯上等同於cmd; if [[ $? -eq 0 ]]; ...