Make:命令失败后如何继续?


142

该命令$ make all给出了诸如此类的错误,rm: cannot remove '.lambda': No such file or directory因此它停止了。我希望它忽略rm-not-found-errors。我该如何强制制作?

生成文件

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex

Answers:


263

尝试-i标记(或--ignore-errors)。该文档似乎建议通过以下方式实现此目的的更可靠的方法:

要忽略命令行中的错误,请在-该行文本的开头(初始选项卡之后)写入a 。该-命令被传递到外壳以供执行之前被丢弃。

例如,

clean:
  -rm -f *.o

rm即使无法删除文件,这也会导致继续。

所有示例均带有rm,但适用于您需要忽略以下错误的其他任何命令(即mkdir)。


30
不要那样!您不应该忽略错误。只需将-f标志添加到rm,并在尝试删除不存在的文件时不再失败。但是,如果确实无法删除文件,它将仍然返回并出错。这就是您想要的行为,出现问题时会失败!
克里斯托夫·普罗斯特

15
@克里斯托夫教务长同意。rm -f可以更好地解决用户遇到的特定问题,但即使有时并不安全,也能很好地了解常规解决方案。
brian_o 2015年

1
这真的很有用,Eli。谢谢。
Beco博士

1
Make还提供了$(RM),您可以代替rm -f
reitermarkus

32

make -k--keep-going我认为,(或在gnumake上)将满足您的要求。

您确实应该找到出现故障的del或rm行,并添加一个-f,以防止该错误发生在其他人身上。


1
我不想说什么,但我想知道他们的想法也是。如果出于某种原因我不明白为什么该标志不合适,那么提出来将是一件好事。
TED 2010年

3
您不应该忽略错误。Brian,Oded和NebuSoft提出的解决方案是正确的。这个和公认的答案是错误的。
克里斯托夫·普罗斯特

1
@KristofProvost-啊 我猜很公平。通常,我也认为,从根本上解决问题的答案要比单纯回答问题的答案(例如这一点)更好。我不确定我是否会为此投票,但是笔触却不同……
TED 2012年

5
好答案。它包含一个直接的顶级标志,没有其他答案,但仍建议正确的行为。错误不应该被忽略,但是知道这些选项是件好事。
brian_o

1
有用的事情是忽略编译器错误...这允许make您在修复编译器遇到的任何问题时构建尽可能多的编译单元。这样,当您修复了所有损坏的内容后,就不必再等待其他所有内容了。
inetknght

20

更改为

rm -f .lambda .lambda_t .activity .activity_t_lambda

即不提示删除;如果文件不存在,请不要抱怨。



11

要使make实际忽略一行错误,您可以简单地在后面加上; true,将返回值设置为0。例如:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

这会将stderr输出重定向到null,并在命令后加上true(始终返回0,无论实际发生什么,make都认为命令成功了),从而允许程序流继续进行。


1
这对我有用,但前导破折号不会出现(我给了一个Makefile来运行需要失败的测试,稍后将解析日志)
Sean Houlihane

2

更改您的位置,clean这样rm就不会抱怨:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda

1

-f在您的rm命令中放置一个选项。

rm -f .lambda .lambda_t .activity .activity_t_lambda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.