如何将输出字符串存储到变量并在控制台中显示

时间:2016-12-16 07:58:40

标签: perl makefile gnu-make

我有一个打印消息的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的字符串消息。

2 个答案:

答案 0 :(得分:1)

你正在捕获一个shell变量,但后来尝试回显一个makefile变量(即使你试图回应shell变量,那也不会起作用,因为make在一个单独的shell进程中运行每一行)。

更改它以回显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)

答案 1 :(得分:0)

首先要记住make的重要一点,即在运行任何规则之前解析整个makefile,然后在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

注意每行以反斜杠结尾,因此它附加到前一行而不是单独的行:make在不同的shell中运行每个单独的行。

或者,如果你有足够新的GNU make,你可以使用one shell功能:

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