11

如果我有以下 bash 命令:

for i in ./ x ; do ls $i ; done && echo OK

执行“ls ./”,然后执行“ls x”,失败(x 缺失)并且不打印 OK。

如果

for i in x ./ ; do ls $i ; done && echo OK

那么即使 "ls x" 失败,因为 for 循环中的最后一条语句成功,也会打印 OK。这是在 makefile 中使用 shell for 循环时的问题:

x:
    for i in $(LIST) ; do \
        cmd $$i  ;\
    done 

如果 cmd 的任何单个执行失败,我如何使 make 失败?

4

2 回答 2

23

当命令失败时使用break命令终止循环

x:
    for i in $(LIST) ; do \
        cmd $$i || break ;\
    done 

但是,这不会使 makefile 中止。您可以改为使用exit非零代码:

x:
    for i in $(LIST) ; do \
        cmd $$i || exit 1 ;\
    done 
于 2013-10-17T20:31:31.960 回答
1

执行命令后,使用 来检查该命令的返回值$?,因为它的 make 文件需要使用 double $。如果它非零,则以失败退出。

x:
    set -e
    for i in $(LIST); do \
        cmd $$i; \
        [[ $$? != 0 ]] && exit -1; \
        echo 'done'; \
    done
于 2018-04-26T15:14:56.393 回答