2014-02-25 20 views
-1

我把下面的Makefile中/tmp目錄停止可變

VAR := $$(basename $$(pwd)) 

do: 
     echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR) 

運行它,我希望這樣的輸出:

tmp 
tmp 
tmp 

但相反的我們:

tmp 
usr 
share 

如何讓它給我以前的輸出?

回答

3

如果您想評估值,您無法逃避$。通過轉義他們,你已經要求shell執行評估。你問的外殼來運行此命令:

echo $(basename $(pwd)) && cd /usr && echo $(basename $(pwd)) && cd /usr/share && echo $(basename $(pwd)) 

,讓你看到的輸出:外殼同時運行一個命令,這樣前面的命令在下單前生效。如果你想在一個shell腳本一個值,你可以使用:

VAR := $$(basename $$(pwd)) 

do: 
     tmp=$(VAR); echo $$tmp && cd /usr && echo $$tmp && cd /usr/share && echo $$tmp 

其shell變量tmp分配到你想那麼值使用,在你的腳本。

或者,你可以計算的價值爲make變量,而不是和使用無處不在:

VAR := $(notdir $(CURDIR)) 

do: 
     echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR) 

(注意你不是在逃避的VAR轉讓的$,所以這是使用make功能不shell命令)。

+0

使用'VAR = $(shell basename $$(pwd))'也行得通。這是不錯的做法嗎? – Tshepang

+0

最後一個版本產生'/ tmp',但我想'tmp'。 – Tshepang

+1

對不起,修正了最新版本。關於使用'shell',是的,它會工作。我不會把它稱爲一個好習慣,因爲你正在運行三個完全相同的shell命令,這是低效率的。即使你把'='改成':=',所以你只運行一次,當你只使用make的內建函數時,運行一個shell並不是那麼高效。但是你會得到同樣的結果,而且你不太可能會注意到效率低下的問題,所以如果它對你更有意義,它可能是「良好的做法」。但我不會使用它。 – MadScientist