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

hhh*_*hhh 126 makefile

该命令$ make all会产生错误,rm: cannot remove '.lambda': No such file or directory因此它会停止.我希望它忽略rm-not-found-errors.我怎么强迫?

Makefile文件

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
Run Code Online (Sandbox Code Playgroud)

Eli*_*sky 231

试试-i旗帜(或--ignore-errors).通过以下方式,文档似乎提出了一种更强大的方法来实现这一目标:

要忽略命令行中的错误-,请在行的文本的开头(在初始选项卡之后)写入a .-在将命令传递给shell执行之前,会将其丢弃.

例如,

clean:
  -rm -f *.o
Run Code Online (Sandbox Code Playgroud)

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

所有示例都包含rm但适用于您需要忽略(ie mkdir)错误的任何其他命令.

  • 不要*做那个!你不应该忽视错误.只需将-f标志添加到rm中,当尝试删除不存在的文件时,它将不再失败.但是,如果它确实无法删除文件,它仍然会返回并出错.这就是你想要的行为,当出现问题时失败! (25认同)
  • @Kristof Provost同意.`rm -f`对于用户所遇到的特定问题更好,但即使它有时不安全,它仍然很好地了解一般解决方案. (12认同)
  • +1 - 领先的破折号是他似乎真正想要的. (11认同)
  • Make 还提供了 `$(RM)`,你可以用它代替 `rm -f`。 (6认同)
  • 只是注意到,在某些情况下,忽略错误代码是合法的:例如,出于信息目的而显示的 make 规则与先前版本的差异。标准 `diff(1)` 对于不同的文件返回 1,因此您可能需要像 `-diff -N $@.prev $@` 这样的操作。然而,由于这仍然会给你一个警告(gnu make),你可能更喜欢 `diff -N $@.prev $@ || true`,虽然看起来很丑,但更安静。 (2认同)

T.E*_*.D. 31

make -k(或者--keep-going在gnumake上)我会这么做你要求的.

你真的应该找到失败的del或rm行并添加一个-f以防止错误发生在其他人身上.

  • 很好的答案.它包含一个简单的顶级标志,没有其他答案包含,但仍然建议正确的行为.错误不应该被忽略,但知道选项是很好的. (5认同)
  • 你不应该忽视错误.Brian,Oded和NebuSoft提出的解决方案是正确的.这一个和接受的答案是错误的. (2认同)
  • 做一些有用的事情是忽略编译器错误......这允许`make`构建尽可能多的编译单元,同时你去修复编译器阻塞的任何东西。这样,当您修复了损坏的任何内容时,您就不必等待其他所有内容也构建完毕。 (2认同)

Bri*_*ton 19

改变干净

rm -f .lambda .lambda_t .activity .activity_t_lambda
Run Code Online (Sandbox Code Playgroud)

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


Bry*_*nta 12

通过rm使用true命令阻止管道后面的返回码成功返回,该命令始终返回0(成功)

rm file | true
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 `rm 文件 || 真实`。这样,如果“rm”返回错误代码,则调用“true”。但是“rm”可能产生的任何控制台输出都不会被管道吞没。 (12认同)
  • 我什至会说你*应该*使用 ` || true` 当您的“真正意图”不是通过管道传输“stdout”时。 (2认同)

Rio*_*iot 11

要使make实际上忽略单行上的错误,您可以简单地将其后缀为; true,将返回值设置为0.例如:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true
Run Code Online (Sandbox Code Playgroud)

这会将stderr输出重定向为null,并遵循带有true的命令(它总是返回0,导致make认为命令成功,而不管实际发生了什么),允许程序流继续.