如何忽略 mv 错误?

发布于 2024-09-07 04:00:31 字数 360 浏览 4 评论 0原文

我正在制作一个 Makefile,将输出文件 (foo.o) 移动到不同的目录 (baz)。

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

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

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

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

I'm making a Makefile that moves an output file (foo.o) to a different directory (baz).

The output file moves as desired to the directory. However since make won't recompile the output file if I type make again, mv gets an error when it tries to move the non-existent empty file to the directory baz.

So this is what I have defined in my rule make all after all compilation:

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

Unfortunately, I'm still getting errors.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

清醇 2024-09-14 04:00:31

食谱中的错误(来自 TFM )

要忽略配方行中的错误,请在配方行的开头写入 -
行的文本(在初始选项卡之后)。

所以目标是这样的:

moveit:
    -mv foo.o ../baz

Errors in Recipes (from TFM)

To ignore errors in a recipe line, write a - at the beginning of the
line's text (after the initial tab).

So the target would be something like:

moveit:
    -mv foo.o ../baz
暖风昔人 2024-09-14 04:00:31

我注意到还没有人真正回答原始问题本身,特别是如何忽略错误(所有答案目前都只涉及在不会导致错误的情况下调用命令)。

要真正忽略错误,您可以简单地执行以下操作:

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

这会将 stderr 输出重定向到 null,并按照 true 执行命令(始终返回 < code>0,使 make 相信命令成功,无论实际发生了什么),允许程序流程继续。

I notice nobody has actually answered the original question itself yet, specifically how to ignore errors (all the answers are currently concerned with only calling the command if it won't cause an error).

To actually ignore errors, you can simply do:

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

This will redirect stderr output to null, and follow the command with true (which always returns 0, causing make to believe the command succeeded regardless of what actually happened), allowing program flow to continue.

逐鹿 2024-09-14 04:00:31
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)

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

-@[ -e "foo.o" ] && mv -f foo.o ../baz
+@[ -d $(dir $@) ] || mkdir -p $(dir $@)

is what I use to silently create a folder if it does not exist. For your problem something like this should work

-@[ -e "foo.o" ] && mv -f foo.o ../baz
捎一片雪花 2024-09-14 04:00:31
   -test -e "foo.o" || if [ -f foo.o ]; then mv -f foo.o ../baz; fi;

那应该有效

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

That should work

以往的大感动 2024-09-14 04:00:31

类似的东西

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"

Something like

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

should work: the operator should be && instead of ||.

You can experiment with this by trying these commands:

test -e testfile && echo "going to move the file"
test -e testfile || echo "going to move the file"
梦情居士 2024-09-14 04:00:31

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

I faced the same problem and as I am generating files, they always have different time. Workaround is set the same time to the files: touch -d '1 June 2018 11:02' file. In that case, gzip generates the same output and same md5sum. In my scenario, I don't need the time for the files.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文