Bash 如何在Make中注释sh脚本

Bash 如何在Make中注释sh脚本,bash,makefile,comments,Bash,Makefile,Comments,Make的语义强制使用\分解复杂的sh脚本。Make将这些食谱转换为(任意长的)一行。因此,我不能使用#进行评论。Make函数$(此处是我的注释的信息)起作用,但是即使配方本身没有被调用,注释也会被打印出来 我想在sh中使用类似于rem“string”的东西 到目前为止,我使用的是Make中的$(调用rem,我的评论在这里), 我将其定义为: rem = $(if,$(1)) 但我不想重新发明轮子,如果有些东西已经存在,而我只是错过了它。特别是,在sh中,我希望保留管道,或者至少是标准输出。您

Make的语义强制使用
\
分解复杂的sh脚本。Make将这些食谱转换为(任意长的)一行。因此,我不能使用
#
进行评论。Make函数
$(此处是我的注释的信息)
起作用,但是即使配方本身没有被调用,注释也会被打印出来

我想在sh中使用类似于
rem“string”
的东西

到目前为止,我使用的是Make中的
$(调用rem,我的评论在这里)
, 我将其定义为:

rem = $(if,$(1))

但我不想重新发明轮子,如果有些东西已经存在,而我只是错过了它。特别是,在sh中,我希望保留管道,或者至少是标准输出。

您可以使用shell的do nothing操作符,即
。就像:

all:
        @echo "hi" ; : this is a comment ; echo "there"
请注意,shell确实扩展了这些字符,因此如果您想使用引号、反勾号等特殊字符,如果您担心它们会导致问题,则应将它们从shell中转义

预计到达时间:

如果您想要一些不会干扰shell行为(如管道)的东西,那么任何shell构造都无法做到这一点;所有可能的方法都会导致shell中出现语法错误

您必须使用make构造来强制make在调用shell之前除去文本。你的例子很有用,但不是因为你想的原因。如果您确实想使用用户定义的函数
rem
,那么要运行它,您需要调用
call
,如下所示:

$(call rem, my comment goes here)
您的方法所做的是,由于没有定义函数
rem
,因此它正在查找名为
rem的变量我的注释在这里
,而该变量不存在,因此它将扩展为空字符串。您可以通过让
rem
函数实际调用
$(info…
或其他东西来看到这一点:它永远不会被打印出来

因此,您可以继续使用
$(rem…
语法,但您也可以删除
rem=$(if,$(1))
,因为它根本不用,只会让人感到困惑。或者你可以使用更小的东西,比如
$(:我的评论在这里)
或者其他什么。实际上,只要不扩展为有效的变量名,就可以在其中放入任何内容


我应该指出,这不一定是未来的证明;由于make中不再允许包含空格的变量名,因此make可能会在将来的某个时候决定以不同的方式处理包含空格的变量引用。

太好了!非常感谢。我想那只是一个空语句。当然,格雷平:在《人》中,bash是完全无用的。那太棒了。谢谢你抽出时间。我喜欢
$(:)
。它比
$(call rem,)
短,如果您知道sh中的
,它看起来是合理的。剩下的唯一问题是让人困惑——这就是为什么我首先使用
$(call rem,)
,而不仅仅是
($if,)
)。后者应该总是有效的,但看起来好像忘记了什么。你能看到,
$(我的评论在这里)
,也就是一个前导空格,可能意味着一些合理的东西吗?我不知道怎么可能,但你永远不知道。我对此表示关注,因为它(对我来说)似乎比
;阅读它的人会说“为什么这里有一个引导空间?”然后删除它,它仍然有效……你可能想删除上面的评论1和2。我编辑了您的回复以合并我已删除的评论,但我没有足够的声誉来更改您的评论。完成后,我也将删除此评论。如果你有任何Qs让我知道。谢谢