Linux生成文件:如何提前退出for循环并显示错误消息

Linux生成文件:如何提前退出for循环并显示错误消息,linux,for-loop,gnu-make,Linux,For Loop,Gnu Make,我正在设置一个makefile来运行一个测试,该测试涉及将生成的文件列表与主目录中的对应文件进行区分。如果diff失败,我可以让循环工作并退出,但我还没有弄清楚如何包含失败消息,并且仍然立即退出for循环(和make过程) 以下是我所拥有的核心: OUTFILE = $(patsubst $(MASTER_DIR1)/%,$(OUTDIR1)/%,$$file) default: test $(OUTDIR1): $(MKDIR) $(OUTDIR1) test: $(OUTDIR

我正在设置一个makefile来运行一个测试,该测试涉及将生成的文件列表与主目录中的对应文件进行区分。如果diff失败,我可以让循环工作并退出,但我还没有弄清楚如何包含失败消息,并且仍然立即退出for循环(和make过程)

以下是我所拥有的核心:

OUTFILE = $(patsubst $(MASTER_DIR1)/%,$(OUTDIR1)/%,$$file)

default: test

$(OUTDIR1):
    $(MKDIR) $(OUTDIR1)

test: $(OUTDIR)
    @for file in $(MASTER_LIST1); do \
        echo $$file; \
        diff $(IGNORE_OPT) \
        $$file \
        $(OUTFILE) \
        && exit 1; \
    done
这会在失败时退出,但不会告知用户原因。我尝试更改
&&exit 1行到:

&& (echo "Diff failed"; exit 1; ); \
显示错误消息但不再退出的

如何添加错误消息并立即退出


蒂亚

根据Etan Reisner在对原始问题的评论中提供的帮助,这是有效的解决方案:

test: $(OUTDIR)
    @for file in $(MASTER_LIST1); do \
        echo $$file; \
        diff $(IGNORE_OPT) \
        $$file \
        $(OUTFILE) \
        && { echo "Diff failed"; exit 1; }; \
    done

使用
{…;}
代替
(…)
<代码>()
是一个子外壳,您的出口会被吞没。也就是说,您不需要为此使用shell循环。你可以让它做所有的事情(通过为每个测试对创建目标,甚至仅仅用一个模式规则),然后失败只会导致停止。@ Etan Reisner,{DeRibe使用{{} }在长for for循环命令的中间应用吗?当我使用
&&{echo“Diff failed”| | exit 1;}gnumake抱怨意外的标记“}”。请注意我的示例块中的间距。
{
后面的前导空格和
}
前面的尾随空格一样重要。