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

问题描述 投票:0回答:8

命令

$ 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
makefile
8个回答
391
投票

尝试使用

-i
标志(或
--ignore-errors
)。 文档似乎提出了一种更强大的方法来实现这一点,顺便说一句:

要忽略命令行中的错误,请在该行文本的开头(在初始选项卡之后)写入

-
。在命令传递到 shell 执行之前,
-
将被丢弃。

例如,

clean:
  -rm -f *.o

这会导致

rm
即使无法删除文件也会继续。

所有示例均带有

rm
,但适用于您需要忽略错误的任何其他命令(即
mkdir
)。


70
投票
我想,

make -k
(或 gnumake 上的
--keep-going
)会满足您的要求。

您确实应该找到失败的 del 或 rm 行,并向其添加

-f
以防止该错误发生在其他人身上。


63
投票

通过使用

rm
命令在管道后面阻止
true
的返回码来成功返回,该命令始终返回
0
(成功)。

请注意,

||
运算符在 shell 中表示 OR。这意味着您基本上正在执行
command OR true
,它将始终返回
true
,因此任何使用它的脚本都将继续。

rm file || true

24
投票

将清洁更改为

rm -f .lambda .lambda_t .activity .activity_t_lambda

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


19
投票

要让 make 实际上忽略单行上的错误,您只需在其后面加上

; true
后缀,将返回值设置为 0。例如:

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

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


4
投票

-f
命令中添加
rm
选项。

rm -f .lambda .lambda_t .activity .activity_t_lambda

3
投票

改变你的

clean
,这样
rm
就不会抱怨:

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

3
投票

使用

-
似乎是处理此类情况的正确方法,因为它可以忽略特定命令的错误,但不是所有错误。

您可以通过以下链接找到更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.