`2>/dev/null`在Makefile中不起作用

fro*_*hem 2 makefile gnu-make

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

Makefile文件:

...
clean: $(wildcard *.mod)
    -rm $^ 2>/dev/null
...
Run Code Online (Sandbox Code Playgroud)

我跑了:

$ make clean
rm  2>/dev/null
make: [clean] Error 64 (ignored)
Run Code Online (Sandbox Code Playgroud)

我仍然遇到了错误.

无论如何,当我尝试

$ rm [some non-existent files] 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

在bash shell上,它运行正常.

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

Tim*_*Tim 5

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

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

Unix(归功于此答案

-rm $^ 2>/dev/null ; true
Run Code Online (Sandbox Code Playgroud)

视窗

-rm $^ 2>NUL || true
Run Code Online (Sandbox Code Playgroud)

或者如果您rm在 Windows 上没有

-del /F /Q $^ 2>NUL || true
Run Code Online (Sandbox Code Playgroud)


bob*_*ogo 5

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

两个修复:

  1. 使用-f rm标志.rm -f永远不会返回错误.(好吧,无论如何,如果确实如此,你可能想知道它!)

  2. 停止shell命令返回错误:只需附加|| :到命令.说什么?好吧,如果rm成功,你的工作完成,让生活很快乐.OTOH如果rm失败,shell在运行第二个命令. :是一个内置的shell总是成功,并且比true恕我直言更好.

在这种情况下,第一个是最好的,尽管第二个是一般的,如果效率稍低的模式.

.PHONY: clean
clean: ; rm -rf *.mod
Run Code Online (Sandbox Code Playgroud)