@ :(符号冒号)在Makefile中的含义是什么?

cdw*_*son 141 makefile gnu-make

Makefile中的以下内容是什么?

rule: $(deps)
    @:
Run Code Online (Sandbox Code Playgroud)

我似乎无法在制作手册中找到这个.

Cha*_*tin 183

这意味着"不要在输出上回显此命令".所以这个规则是说"执行shell命令:而不回显输出.

当然shell命令:是no-op,所以这就是说"什么都不做,不要告诉".

为什么?

这里的诀窍是你有两种不同语法的模糊组合.在使(1)的语法是开始@,这简直是不呼应命令使用的动作.所以像这样的规则

always:
       @echo this always happens
Run Code Online (Sandbox Code Playgroud)

不会发出

   echo this always happens
   this always happens
Run Code Online (Sandbox Code Playgroud)

现在,规则的操作部分可以是任何 shell命令,包括:.Bash帮助解释了这个以及任何地方:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Run Code Online (Sandbox Code Playgroud)

  • 不要取笑我的打字,你有一天也会变老. (18认同)
  • 不是最模糊的. (8认同)
  • @charles-keepax 如果您专门询问`@:`(不仅仅是`@`),那么除了@guestolio 的回答之外,它也可能是开发过程中的剩余存根。这就像在 Python 中编写一个只包含 `pass` 的函数。它对于复制/粘贴代码块很有用,但它们通常不应该存在很长时间。当以这种方式存根时,文件仍会编译、传递 linting 等。 (4认同)
  • 这是对它的作用的一个很好的解释,但你有没有机会知道为什么你会在makefile中这样做? (3认同)
  • 它在调用大量外部程序的 makefile 中很有用,并且在您想大量使用 echo 以使其看起来不错的地方,例如 [this one](https://github.com/gbluma/latex-boilerplate/blob /主/生成文件) (3认同)

小智 34

对于那些对你为什么这样做感到好奇的人来说,如果你想假装已经完成了某些事情,那么它就很有用,因此Make不会输出"你的目标无需做任何事".

一个例子是如果你有一个总是执行的虚假目标,并且在其中你在命令中有一堆条件.你想要至少有一些东西,以防这些条件出现错误,什么也没做.

例如(来自Linux的脚本/ Makefile.clean):

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
Run Code Online (Sandbox Code Playgroud)