2012-12-13 87 views
1

He,
我想將一個文件(包含相對文件路徑)的內容讀取到一個變量並在文件的每一行前加上一條路徑。然後將所有這些文件複製到一個目錄中。 像這樣:

$(httpd_DIR)/my.tar: $(mypath)/html.txt 
    rm -rf web 
    mkdir -p web 
    VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt)) 
    cp -R $$VV $(httpd_DIR)/web 
    $(TAR) -C $(httpd_DIR) -cvf $(httpd_DIR)/web.tar web 


的$(mypath中)/html.txt文件中包含這樣的相對文件路徑的列表:
DIR1 /的file1.html
DIR2/file2.html
DIR3/file3.html

出於某種原因,我得到的跟隨着錯誤:
/斌/慶典:VV:找不到命令

我不是想要執行VV,那麼爲什麼要給我這個錯誤呢?
請注意,如果我取消註釋cp命令,我仍然會得到相同的錯誤... 我在Linux PC上使用GNU make。

回答

2

這裏有幾個問題。

VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt)) 

你還沒有告訴我們你使用的是什麼shell,所以我會假設bash。

如果你想在bash中指定一個變量,你必須注意空格:VV=foo是合法的,並且會做你期望的,但是如果你鍵入VV = foo,shell會將第一個單詞「VV」解釋爲命令,而且遲鈍。如果輸入VV=foo bar,shell會將foo指定爲VV,然後拒絕命令bar。您可以改用VV="foo bar"

然後你遇到另一個問題。每個命令在自己的子shell中運行,所以在一個命令賦值的變量沒有生存到下一個:

VV=foo 
echo $$VV # this will echo a blank 

您必須結合命令,就像這樣:

VV=foo ; echo $$VV # this will echo foo 

或本:

VV=foo ; \ 
    echo $$VV # this will echo foo 

(請注意,只有一個TAB那裏,第一行之前。)

一般來說,在插入真實命令之前,應該用最簡單的命令測試這些結構。這樣一來,抓住這些錯誤就容易多了。

+1

很好解釋。另一個問題是命令不會創建目標文件。正如所寫,命令更新web.tar,而不是my.tar。 – Idelic

+0

@愛德華:好點。直到我引入自動變量(這是改進這個makefile的下一步)之前,我通常不會注意到這樣的錯誤。 – Beta

+0

他,非常感謝這個信息,它非常有幫助!我也會檢查自動變量。 – user1900375