2016-12-16 73 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 
相关问题