2012-11-26 28 views
0

我有以下make文件,我認爲它是一個shell腳本。Unix shell bash腳本無法放入echo調試語句

我試圖循環通過FILE_DIR來執行一些操作。不過,我覺得這個實現並不像預期的那樣工作。所以我試圖插入一些echo斷點。

來源:

# Target to recurse through the DIR_LIST and make each makefile found in that DIRS 
ALLDIRS: 
     for se in $(FILE_DIR); do \ 
       if [ -d $se ]; then \ 
       cd $se; \ 
       $(MAKE) -f Makefile.mk all; \ 
       cd ..; \ 
       fi \ 
     done 

運行:

$ make -f Makefile.batch 

h: syntax error at line 3: `then' unexpected 
*** Error code 2 
The following command caused the error: 
for se in `ls -p /app/internal|grep "/"`; do \ 
     echo "Test" \ 
     if [ -d e ]; then \ 
     cd e; \ 
     /usr/ccs/bin/make -f Makefile.mk all; \ 
     cd ..; \ 
     fi \ 
done 
make: Fatal error: Command failed for target `ALLDIRS' 

我能請得到幫助這一點。想插入一個echo斷點。

+0

我沒有看到你的'echo'語句的問題,而是你的'if'語句是兩個版本之間的不同。 – tjameson

+0

我無法重現此錯誤。嘗試一個更簡單的命令。 – Beta

+0

@tjameson第二個版本是make的輸出,完全顯示了我的答案中的第二點。 –

回答

3

Makefile s中的一個常見錯誤是在命令行中使用空格而不是製表符。檢查整個for循環,並確保另一個錯誤是美元符號$只有標籤在每一行

ALLDIRS: 
<tab>for se in $(FILE_DIR); do \ 
<tab><tab>if [ -d $se ]; then \ 
<tab><tab>cd $se; \ 
<tab><tab>$(MAKE) -f Makefile.mk all; \ 
<tab><tab>cd ..; \ 
<tab><tab>fi \ 
<tab>done 

的開始。如果你想在shell命令中使用美元符號,則必須在命令中加倍,因爲否則美元會引入一個變量,並且在shell看到它之前會進行擴展。

for se in $(FILE_DIR); do \ 
    if [ -d $$se ]; then \ 
     cd $$se; \ 
     $(MAKE) -f Makefile.mk all; \ 
     cd ..; \ 
    fi \ 
done 

,最後一個,echo Test需要一個分號以及

for se in $(FILE_DIR); do \ 
    if [ -d $$se ]; then \ 
     echo "Test"; \ 
     cd $$se; \ 
... 
+1

A 僅在每個*命令*的開始處是必需的。其他十一個是命令的內部,並且不需要。 – Beta

+0

@貝塔這不是必要的,但一個好習慣。所以你不會試圖跳過它,*當*必要時。 –