2014-12-19 108 views

回答

0

從GNU進行手動的部分5.3 Recipe Execution

當是時候來執行食譜更新目標,他們通過調用一個新的子殼爲配方的每一行執行,除非該.ONESHELL特殊目標有效(請參閱使用一個shell)(實際上,make可能會採用不影響結果的快捷方式。)

請注意:這意味着要設置shell變量並調用shell命令,例如cd設置每個進程的本地上下文不會影響配方中的以下行。如果要使用cd來影響下一個語句,請將兩條語句都在一個配方行中。然後make將調用一個shell來運行整個行,並且shell將按順序執行這些語句。例如:

foo : bar/lose 
     cd $(@D) && gobble $(@F) > ../[email protected] 

這裏我們使用殼牌和運營商(& &),這樣,如果cd命令失敗,腳本將不嘗試在錯誤的目錄調用狼吞虎嚥命令失敗,這可能會導致問題(在這種情況下,它肯定會導致../foo被截斷,至少)。

使用反斜槓將命令分割爲多行。正如手冊的5.1 Recipe Syntax部分所詳細解釋的那樣。

make解釋食譜的幾種方法之一是在換行符之前檢查反斜線。和通常的makefile語法一樣,通過在每個換行符之前放置一個反斜槓,可以將單個邏輯配方行分割成makefile中的多條物理行。像這樣的一系列行被認爲是單一的配方行,並且會調用一個shell實例來運行它。

+0

要在一個單殼中,整行需要被'('和')'包圍 – user3629249 2014-12-19 11:33:32

+0

@ user3629249不,它沒有。這樣做會啓動一個(無意義的)子shell。 – 2014-12-19 12:32:55

4

之間的差值。當多條線路被連接通過用反斜槓轉義換行符,它們將全部運行在同一個shell中。如果使用shell變量,這可能很重要。當每個命令出現在它自己的行上時,它們將分別運行在一個新的shell中。