如何忽略mv错误?

时间:2010-06-29 18:28:14

标签: makefile

我正在创建一个Makefile,将输出文件(foo.o)移动到另一个目录(baz)。

输出文件根据需要移动到目录。但是,如果再次键入make,make将不会重新编译输出文件,mv在尝试将不存在的空文件移动到目录baz时会收到错误。

所以这是我在所有编译后在我的规则make all中定义的内容:

-test -e "foo.o" || mv -f foo.o ../baz

不幸的是,我仍然遇到错误。

6 个答案:

答案 0 :(得分:102)

Errors in Recipes(来自TFM)

  

要忽略配方行中的错误,请在开头写下-   line的文本(在初始标签之后)。

所以目标就像:

moveit:
    -mv foo.o ../baz

答案 1 :(得分:31)

我注意到没有人真正回答了原来的问题本身,特别是如何忽略错误(目前所有答案都只关注调用命令,如果它不会导致错误)。

要实际忽略错误,您只需执行以下操作:

mv -f foo.o ../baz 2>/dev/null; true

这会将stderr输出重定向到null,并按照命令true(始终返回0,导致make认为命令成功,而不管实际是什么发生了),允许程序流程继续。

答案 2 :(得分:9)

+@[ -d $(dir $@) ] || mkdir -p $(dir $@)

是我用来静默创建文件夹(如果它不存在)。对于你的问题,这样的事情应该起作用

-@[ -e "foo.o" ] && mv -f foo.o ../baz

答案 3 :(得分:1)

   -test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi;

那应该有用

答案 4 :(得分:0)

这样的东西
test -e "foo.o" && mv -f foo.o ../baz

应该有效:运营商应该是&&而不是||

您可以尝试以下命令进行试验:

test -e testfile && echo "going to move the file"
test -e testfile || echo "going to move the file"

答案 5 :(得分:0)

我遇到了同样的问题,当我生成文件时,它们总是有不同的时间。解决方法是将文件设置为同一时间: touch -d '1 June 2018 11:02' file。在这种情况下,gzip 生成相同的输出和相同的 md5sum。在我的场景中,我不需要时间来处理文件。