2012-10-25 15 views
9

grep的退出代碼我想檢查在一個Makefile grep搜尋的結果。與this solution相反,我不希望使用shell命令。 另外,我不希望Makefile在grep找不到字符串(1的退出代碼被視爲錯誤)時引發錯誤。Makefile中

以下嘗試忽略該錯誤並檢查退出代碼:

all: 
    -grep term log* 
    echo $$? 
    @case "$$?" in \ 
     0)\ 
    echo "found";; \ 
    *) \ 
    echo "not found";;\ 
    esac; 

不幸的是,退出代碼始終爲0。

+0

哦,我一直在尋找這個!創造了我的一天。謝謝 – lzap

回答

7

的一系列動作的一個makefile單獨線通常在單獨的子shell中執行。要編碼你所追求的,然後:

all: 
    if grep term log*; \ 
    then echo found; \ 
    else echo not found; \ 
    fi 

這是一個單一的命令;它直接測試grep的退出狀態。請注意自由使用分號碼;這是必要的,因爲它在傳遞到shell時會變得平坦。請注意,-不是必需的;整個語句以狀態0退出,因爲echo命令之一被執行,成功並且是從子shell返回的狀態。但是還有另一部分的訣竅。 IIRC,腳本調用與/bin/sh -e因此腳本在所述第一誤差(非零)從外殼命令狀態退出 - 除了在明確的條件語句,如if

如果你想明確地捕捉grep狀態(如果只是爲了確保它正在做的權利),那麼:

all: 
    -grep term log*; \ 
    status=$$?; echo $$status; \ 
    if [ $$status = 0 ]; \ 
    then echo found; \ 
    else echo not found; \ 
    fi 

你可能需要-這個時間,因爲grep並不像部分執行的shell條件和非零退出狀態可能會觸發-e處理。我不建議這樣做。

您可能注意到,你可以在一個動作做cd命令和因爲每個動作單獨執行,你必須重複做。

install: ${PROG} 
    cd ${INSTBIN}; ${RM_F} ${PROG} 
    ${CP} ${PROG} ${INSTBIN} 
    cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG} 

是的,你可以以不同的方式做 - 我正在展示一個觀點,並不主張安裝程序的風格。

+0

第一個解決方案非常優雅。隨着詳細的解釋,接受! 雖然我不理解最後一段中的觀點。 –

+0

而不是'cd $ {INSTBIN}; $ {RM_F} $ {PROG}',我可以寫出:'$ {RM_F} $ {INSTBIN}/$ {PROG}',根本沒有'cd'。這就是我所說的。 (我在makefile上工作,這基本上是如何將代碼從構建區域 - 從根部到我的厭惡 - 複製到分發目錄 - 我不會讓你知道它是如何得到的,爲什麼我沒有修復它還沒有。) –

+0

在我有限的Makefile經驗中,唯一使用cd的是調用一個子Makefile。 –