【问题标题】:`2>/dev/null` does not work inside a Makefile`2>/dev/null` 在 Makefile 中不起作用
【发布时间】:2018-05-11 15:28:10
【问题描述】:

我试图通过写入来抑制来自rm 命令的错误

生成文件:

...
clean: $(wildcard *.mod)
    -rm $^ 2>/dev/null
...

我跑了:

$ make clean
rm  2>/dev/null
make: [clean] Error 64 (ignored)

我还是遇到了错误。

无论如何,当我尝试时

$ rm [some non-existent files] 2>/dev/null

在 bash shell 上,它运行良好。

如何在 makefile 中使用2>/dev/null

【问题讨论】:

  • 任何解决方法?

标签: makefile gnu-make


【解决方案1】:

消息make: [clean] Error 64 (ignored) 正在由make 在发现您的shell 命令失败后打印。 因此,它不会受到您在配方中使用的任何重定向的影响。

两个修复:

  1. 使用-f rm 标志。 rm -f 从不返回错误。 (好吧,几乎从来没有,如果你可能想知道它!)

  2. 停止返回错误的 shell 命令:只需将|| : 附加到命令。 说什么?好吧,如果rm 成功,您的工作就完成了,make 很高兴。 OTOH 如果rm 失败,shell 将运行 中的第二个命令。 : 是一个始终成功的内置 shell,比 true 恕我直言更可取。

在这种情况下,第一个是最好的, 尽管第二种模式是一种通用的模式,但效率稍低。

.PHONY: clean
clean: ; rm -rf *.mod

【讨论】:

    【解决方案2】:

    2>dev/null 将重定向错误输出,因此您看不到它,它不会阻止 shell 提高错误级别。并且您的 shell 命令前面的 - 符号将告诉 GNU make 继续,即使错误级别被提高,但它也不会阻止 shell 提高它。

    你想要的是 shell 不提高错误级别,这可以这样做:

    Unix(归功于this answer

    -rm $^ 2>/dev/null ; true
    

    Windows

    -rm $^ 2>NUL || true
    

    或者如果您在 Windows 上没有 rm

    -del /F /Q $^ 2>NUL || true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多