2015-02-17 2 views
0

Каковы правила в GNU make относительно символов цитат? Я думал, что в большинстве случаев они просто будут частью текста в файле make и обычно не имеют особого значения. Следующий простой файл make демонстрирует, что символы двойной кавычки, появляющиеся вокруг аргумента в $ (if ...), удаляются, а не передаются из вызова $ (if). Это кажется неправильным, и странно, что незапрошенные кавычки проходят через более сложный файл make, который я использовал.

include gmsl 

VAR1 ?= var1_value 
VAR2 ?= var2_value1 var2_value2 

failquote = $(if $(call ne,$(words $(1)),1),"$(1)",$(1)) 
passquote = $(if $(call ne,$(words $(1)),1),\"$(1)\",$(1)) 

TESTFAILQUOTE = $(call failquote,$(VAR2)) 
TESTPASSQUOTE = $(call passquote,$(VAR2)) 

quotetest : 
    @echo "--->Executing recipe for quotetest" 
    @echo VAR2 is $(VAR2) 
    @echo TESTFAILQUOTE = $(TESTFAILQUOTE) 
    @echo TESTPASSQUOTE = $(TESTPASSQUOTE) 

Выхода таким образом:

bash-4.1$ make -f test_quote.mk quotetest 
--->Executing recipe for quotetest 
TESTFAILQUOTE = var2_value1 var2_value2 
TESTPASSQUOTE = "var2_value1 var2_value2" 

Примечания: вам потребуется сделать Gnu Стандартной библиотеки для этого сделать файл для работы, за $ (п вызова, ...). Найдите его здесь: http://gmsl.sourceforge.net/

+0

В чем проблема? Является ли этот вывод некорректным? Правильно ли MadScientist, и проблема здесь - это только выходные пропущенные кавычки, потому что оболочка лишает их? –

+0

Проблема в том, что мне нужны символы буквенной цитаты на выходе. MadScientist является и острым, и очень милостивым с его/ее помощью, и правильно - если кавычки должны сделать это с командой «эхо», они должны быть экранированы в значении переменной make. –

+0

Нет, выход из них в значение переменной не является ответом. Ответ цитирует расширение переменной на строке оболочки, поэтому оболочка не разделяет их. –

ответ

3

Вы ошибаетесь. Не делайте никаких кавычек. Однако make вызывает оболочку, и оболочка будет лишать кавычки.

Если вы удалите маркеры @ в начале ваших линий echo, вы увидите, как make вызывает оболочку; Вы увидите:

echo TESTFAILQUOTE = "var2_value1 var2_value2" 
var2_value1 var2_value2 
echo TESTPASSQUOTE = \"var2_value1 var2_value2\" 
"var2_value1 var2_value2" 

Если запустить ту же команду эха в вашей оболочке подскажет вы получите те же результаты, показывающее, что все это не связанно сделать.

+0

Спасибо, ты точно прав. Я собирался сам ответить, но ты быстрее меня! Я бы поднял ответ, но еще не получил достаточного количества кредитов. –

+0

Одиночная цитата делает переменные расширения, используемые в командных строках командной строки так же, как вы удваиваете разметку оболочки оболочки в обычных условиях. Вам необходимо предотвратить обычные расширения оболочки/etc. от происходящего. –