2012-11-26 29 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

@贝塔这不是必要的,但一个好习惯。所以你不会试图跳过它,*当*必要时。 –