2016-06-22 3 views
0

Я попытался поместить следующую команду в make-файл.с использованием переменной makefile в команде sed

#get Local Ip Address 
LOCALIP=$(shell ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | awk '{print $1}') & 

#get Web Url from User 
@read -p "Enter Web Url:" weburl; \ 

sed -e "\|$LOCALIP $weburl|h; \${x;s|$LOCALIP $weburl||;{g;t};a\\" -e "$LOCALIP $weburl" -e "}" hosts.txt 

При попытке выполнить команду, я ожидал получить SED команды, как следующее:

sed -e "\|192.168.5.1 www.weburl.com|h; \${x;s|192.168.5.1 www.weburl.com||;{g;t};a\\" -e "192.168.5.1 www.weburl.com" -e "}" hosts.txt 

Но, я получаю следующее,

sed -e "\|/s/$/OCALIP eburl|h; \" hosts.txt 
+1

Переменные Makefile обычно заключаются в '$ (...)'. –

+0

Я пробовал. Теперь я получаю следующее. sed -e "\ | 192.168.5.1 & |h; \" hosts.txt –

+1

Вместо того чтобы пытаться преобразовать все эти инструкции оболочки в синтаксис Makefile, не можете ли вы поместить их в скрипт и вызвать этот скрипт из Makefile? – oliv

ответ

0

В Makefiles, переменные дольше, чем один символ (т. е. все переменные, которые вы, вероятно, определите), необходимо развернуть с помощью ${varname}, а не $varname. Последнее приведет к значению $v, объединенного со строкой arname, как вы обнаружили.

Я не буду разбирать остальную часть этого файла Makefile, поскольку трубопровод выглядит немного сомнительным.

+0

Не использует makefile '$ (varname)', а не '$ {varname}'? – Barmar

+0

@Barmar Оба произведения. GNU Make говорит, что «либо» $ (foo) ', либо' '$ {foo}' является допустимой ссылкой на переменную 'foo', а BSD Make использует' $ {foo} 'исключительно в руководстве. – Kusalananda

+0

Я думаю, что в наши дни круглые скобки более идиоматичны, и [O'Reilly Make book] (http://www.oreilly.com/openbook/make3/book/ch03.pdf) согласна. – Barmar

Смежные вопросы