Makefile在bash中工作,但在zsh中失败。您能指出for循环语法中的错误吗?

Makefile在bash中工作,但在zsh中失败。您能指出for循环语法中的错误吗?,makefile,zsh,Makefile,Zsh,下面是一个GNUMakefile的开头,它在bash下运行良好,但自从我切换到zsh(哦,我的zsh)后就失败了。我需要启动一个bashshell来执行它,这很烦人,所以您认为您可以帮助指出语法问题吗 SUBDIRS = generator geometry io management physicslist processing makeall: @echo "*********************************************************

下面是一个GNUMakefile的开头,它在bash下运行良好,但自从我切换到zsh(哦,我的zsh)后就失败了。我需要启动一个bashshell来执行它,这很烦人,所以您认为您可以帮助指出语法问题吗

SUBDIRS = generator geometry io management physicslist processing


makeall:
        @echo "********************************************************************************"
        @echo " Building Project"
        @echo "********************************************************************************"
        @for dir in $(SUBDIRS); do (echo; echo; echo Building $$dir...; cd $$dir; $(MAKE) "SUBDIRS=$(SUBDIRS)"); done
这将导致无限循环:

[●]% make
********************************************************************************
 Building Project
********************************************************************************


Building generator...
/bin/sh: line 0: cd: generator: No such file or directory
********************************************************************************
 Building Project
********************************************************************************


Building generator...
/bin/sh: line 0: cd: generator: No such file or directory
********************************************************************************
 Building Project
********************************************************************************
...
...
似乎我用make's和/bin/sh's叉子炸了自己:

...
...
24921 ttys012    0:00.00 make SUBDIRS=generator geometry io management physicslist processing
24925 ttys012    0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24926 ttys012    0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24927 ttys012    0:00.00 make SUBDIRS=generator geometry io management physicslist processing
24931 ttys012    0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo; echo Building $dir...; cd $dir; make "SUBDIRS=generator geometry io man
24932 ttys012    0:00.00 /bin/sh -c for dir in generator geometry io management physicslist processing; do (echo; echo
...
...
编辑:

生成器内部的makefile如下所示:

name := generator

include ../ProgramConfig/Libraries.gmk
Libraries.gmk看起来像

.PHONY: all lib
all: lib

include ../ProgramConfig/BuildDirs.gmk

include $(G4INSTALL)/config/architecture.gmk
include $(G4INSTALL)/config/common.gmk

include ../ProgramConfig/ExtraDeps.gmk
include ../ProgramConfig/GEANT4.gmk

# Add the sub-directory include directories to the compilation list
CPPFLAGS += $(addprefix -I../, $(addsuffix /include, $(SUBDIRS))) -O2

cleanup:
    cd $(G4WORKDIR)
    rm -rf bin tmp lib

实验一。试试这个:

makeall:
    @for dir in $(SUBDIRS); do (echo Building $$dir...; cd $$dir; $(MAKE) "SUBDIRS=$(SUBDIRS)" ; cd -); done
我想到的更安全的方法是:在Make中迭代,而不是在shell中

makeall: $(SUBDIRS)

.PHONY: $(SUBDIRS)

$(SUBDIRS):
    @echo Building $@
    @cd $@; $(MAKE) "SUBDIRS=$(SUBDIRS)"
请注意,您还可以将最后一条规则稍微简化:

$(SUBDIRS):
    @echo Building $@
    @$(MAKE) -C $@ "SUBDIRS=$(SUBDIRS)"

语法看起来是正确的,如果缺少一个子项,它将进入无限循环。您确定存在
生成器
子目录吗?请尝试
makeall:@ls | grep generator
以确保。此外,还有更安全的方法让它在子目录上迭代。@Beta:子目录都在那里,并且makefile可以与bash一起正常工作。但是,为了探索这个选项,在子目录上进行迭代的更安全的方法是什么?仍然是一个具有相同输出的无限循环,但是由于循环处于Make中,我可以^C out并避免fork炸弹。至少我可以更轻松地进一步诊断。@vgm64:等一下。您能给我们看看
generator/
中的makefile吗?