gnu make https://www.gnu.org/software/make/manual/make.html#toc-Functions-for-Transforming-Text имеет функцию сортировки. В описании функции сортировки указано, что функция сортировки
Sorts the words of list in lexical order, removing duplicate words. The output is a list of words separated by single spaces.
Я создал тестовый make-файл, подобный этому
TEST = "this is a test test test test test"
all:
@echo $(sort $(TEST))
Мой вывод это пробный тест
Дубликаты не были полностью удалены из строки! Я неправильно интерпретирую функцию сортировки? Или это ошибка в gnu make?
Обратите внимание на двойные кавычки. "This is a test test test test" становится "This is a test test", которое оболочка печатает как This is a test test.
...Странно, что sort не сортирует строку в кавычках, но удаляет из нее дубликаты...
Ваша переменная TEST содержит 5 разных слов: "this, is, a, test и test". И только слово test дублируется.
Согласен, что тест дублируется. Но есть 3 дубликата. Если бы у меня была строка «тест, тест, тест, тест» и я хотел бы удалить дубликаты, я бы подумал, что результатом будет строка «тест», вы согласны?





В двойных кавычках нет ничего особенного. Таким образом, переменная TEST содержит слова "This, is, a, test, test, test и test", которые затем сортируются с удалением дубликатов как "This, a, is, test и test", и, таким образом, оболочка получает (1) echo "This a is test test", интерпретирует двойной кавычки в качестве строковых маркеров и выходов This a is test test (а не This is a test test см. место a).
(1) Полезный совет по отладке подобных проблем с make — установить для переменной SHELL значение /bin/echo, чтобы вы могли видеть, что получает оболочка. Например, у вас было бы в результате -c echo "this a is test test" с Makefile
TEST = "this is a test test test test"
SHELL=/bin/echo
all:
@echo $(sort $(TEST))
Спасибо за указание на позицию А. Но рассмотрим строку «тест тест тест тест». Разве вы не ожидаете, что функция сортировки удалит дубликаты и результат будет контрольная работа, а make выдаст результат тест тест тест. Каково тогда определение дубликаты в функции сортировки?
AProgrammer пытается указать вам, что сделать не делает ничего особенного с двойными кавычками. Итак, первое «слово» в переменной TEST — это литеральная строка "this (включая двойные кавычки). Точно так же последнее слово в переменной — это литеральная строка test" (включая двойные кавычки). Строка-литерал test" не совпадает с строкой-литералом test, поэтому make не удалит ее как дубликат. Точно так же при сортировке литеральной строки "this двойные кавычки сортируются раньше, чем все буквенные символы, так что слово остается в начале результата.
Затем, когда вы передадите это echo через оболочку, оболочка удалит двойные кавычки, чтобы вы их не видели. Если бы вместо этого в вашем рецепте использовались одинарные кавычки вокруг результата, например: @echo '$(sort $(TEST))', то вы бы увидели, что двойные кавычки все еще там: make не удалял их и не анализировал их каким-либо образом. Это просто строка, чтобы сделать.
Спасибо за разъяснения. Я понял.
@imendel, если у вас «понятно», отметьте ответ, чтобы мы знали, что он решен :)
Исправление переменной TEST: «Это тестовый тест, тест, тест».