Makefile 生成排序内置函数

Makefile 生成排序内置函数,makefile,gnu-make,Makefile,Gnu Make,gnu make具有排序功能。排序函数的说明说明了该排序函数 按词汇顺序对列表中的单词进行排序,删除重复的单词。输出是由单个空格分隔的单词列表 我创建了一个这样的测试生成文件 TEST="this is a test test test test test" all: @echo $(sort $(TEST)) 我的输出是这是一个测试 没有从字符串中完全删除重复项! 我是否错误地解释了排序函数?或者这是gnu make的一个bug?双引号一点也不特别。因此,TEST变量包含单词T

gnu make具有排序功能。排序函数的说明说明了该排序函数

按词汇顺序对列表中的单词进行排序,删除重复的单词。输出是由单个空格分隔的单词列表

我创建了一个这样的测试生成文件

TEST="this is a test test test test test"

all:

     @echo $(sort $(TEST))
我的输出是这是一个测试

没有从字符串中完全删除重复项!
我是否错误地解释了排序函数?或者这是gnu make的一个bug?

双引号一点也不特别。因此,TEST变量包含单词This,is,a,TEST,TEST,TEST和TEST,然后对这些单词进行排序,并删除重复项作为This,a,is,TEST和TEST,因此shell gets1回送This a is TEST TEST TEST,将双引号解释为字符串标记,并输出This a is TEST TEST,而不是This is TEST TEST参见a的位置

1调试make问题的一个有用技巧是将SHELL变量设置为/bin/echo,这样您就可以看到SHELL得到了什么。例如,您会得到一个结果-c echo,这是一个带有Makefile的测试

TEST="this is a test test test test"
SHELL=/bin/echo
all:
    @echo $(sort $(TEST))

修正测试变量是这是一个测试观察双引号。这是一个测试,这是一个shell打印的测试,因为这是一个测试…奇怪的是,排序没有在带引号的字符串中排序,而是删除其中的重复项…测试变量包含5个不同的单词:This,is,a,test和test。只有测试词是重复的。同意测试是重复的。但有3个重复。如果我有一个字符串测试,我想删除重复的,我会认为结果会是字符串测试,你同意吗?谢谢你指出了a的位置。但是考虑一个字符串测试测试测试,您不希望排序函数删除重复,输出将是测试,而做出产品输出测试测试。那么,排序函数中重复项的定义是什么呢?一位程序员试图向您指出的是,make对双引号没有任何特殊作用。因此,变量测试中的第一个单词是文本字符串,包括双引号。类似地,变量中的最后一个字是包含双引号的文本字符串测试。文字字符串测试与文字字符串测试不同,因此make不会将其作为副本删除。类似地,在对文本字符串进行排序时,双引号的排序早于所有字母字符,因此word保留在结果的开头。然后,当您通过shell将其传递给echo时,shell将删除双引号,这样您就看不到它们。如果您的配方在结果周围使用单引号,例如:@echo'$sort$TEST',那么您会看到双引号仍然存在:make没有删除它们或以任何方式解析它们。这只是一个字符串。谢谢你的澄清。我知道了。@imendel如果你知道了,请把答案标出来,这样我们就知道问题已经解决了: