2016-12-16 26 views
0

我有一個打印消息的perl腳本。這個腳本被GNU make調用。在我的GNU make中,我想顯示由腳本打印出來的消息並將其存儲在一個變量中。如何將輸出字符串存儲到變量中並在控制檯中顯示

我正在這樣做。

result=`$(PERL) parse.pl report.log` #parse the report 
echo $(result) #echo the message here 
ifneq ($(strip $$(result)),) #check if message is empty 
    #if not empty, search for filepath string pattern and exit 
    echo filepath 
    exit 1 
endif 

但它沒有顯示來自parse.pl的字符串消息。

+0

你有什麼要與捕捉到的線路後怎麼辦?顯示你的Makefile的一部分。你捕獲到一個shell變量中,但是然後試圖回顯一個makefile變量(即使你試圖回顯shell變量,那也不行,因爲make在單獨的shell進程中運行每行)。 – ysth

+0

我已經更新了更多的細節。我還沒有想出如何對$ result執行regex,所以對任何提示都會很高興。 –

回答

1

您正在捕獲到一個shell變量,但隨後嘗試回顯makefile變量(並且即使您試圖回顯shell變量,由於make會在單獨的shell進程中運行每行)也無法工作。

改變它呼應了貝varible和所有在一個shell中運行應該工作:

foo: 
    result=`$(PERL) parse.pl report.log`; \ 
    echo $$result 

但無論你以後需要做的,使用捕獲結果還需要在同一個shell執行。

顯然,你可以捕捉到一個makefile變量太多,這可能是更方便:

foo: 
    $(eval result := $(shell $(PERL) parse.pl report.log)) 
    echo $(result) 
+0

嗯..沒有什麼會與此顯示。 –

+0

用更好的答案替換錯誤的答案 – ysth

+0

謝謝!它現在有效。我必須始終將結果稱爲$$結果嗎?我想檢查它是否爲空。如果我添加這行「ifeq($(strip $$(result)),)」,我得到這個錯誤:「/ bin/sh:-c:第2行:語法錯誤附近的意外標記'$(result),' /bin/sh:-c:第2行:ifeq($(result),)\'「 –

0

要記住用make關鍵的是第一,整個生成文件解析的規則運行之前,第二個makefile有兩個完全不同的語法:大部分是makefile語法,配方是shell語法。 shell語法由shell運行,而不是由make運行:make只是啓動一個shell,交出配方,並等待shell退出以查看它是否工作。

由於這個原因,你不能將諸如ifeq這樣的make結構與shell命令及其結果結合起來:它不能工作,因爲所有的make結構都是首先被解析的,而makefile被讀入,而shell命令沒有運行直到很久以後,當目標被建造時。

在你的情況下,你需要在shell語法中編寫整個東西,因爲你希望事情依賴於shell調用。

所以,像這樣:

foo: 
     result=`$(PERL) parse.pl report.log`; \ 
     echo $$result; \ 
     if [ "$$result" = "" ]; then \ 
      echo filepath; \ 
      exit 1; \ 
     fi 

注意每一行以反斜線是如何結束的,所以它的附加在前行,而不是作爲一個單獨的行:使運行在不同的外殼每個單獨的一行。

或者,如果你有一個新的,足以讓GNU您可以使用one shell功能:

.ONESHELL: 
foo: 
     result=`$(PERL) parse.pl report.log` 
     echo $$result 
     if [ "$$result" = "" ]; then 
      echo filepath 
      exit 1 
     fi 
相關問題