如何在make中使用(这个特定的)awk命令并将结果保存到一个变量中?



我尝试了两种方法。A)使用make的shell函数,B)设置一个环境变量。这两种方法在转义时会遇到问题。

粗略地说,我试图在makefile中运行的命令是
awk '{if ( $0 !~ /^#/ ) print $2 }' data.dat | tail -1

我想将该值存储到一个变量中以供以后使用。是感叹号引起了麻烦。我已经尝试了各种方法来逃避它,但无济于事。

编辑:在尝试了下面的建议后,似乎这个问题比感叹号更根本。一个新的较小的测试用例是就像
 awk '{ print $2 }' data.dat | tail -1

,我现在假设文件没有注释。罪魁祸首现在是撇号,或者我在make.

中使用了UNIX管道。

编辑2:半解…我忘了用$$来表示make内的$。希望这能让我发布一个解决方案。

EDIT 3:在make中定义make变量时,括号的解析方式似乎不允许使用它们的shell函数调用的use命令。基本上,这意味着如果想要存储结果,就不能真正从make中使用gawk一行程序。

这并不能完全回答你的问题,但我认为你可以绕过awk使用

grep -v "^#" | cut -f 2 | tail -n 1

你可以重写你的regg -exp移动到否定发生的地方,即

awk '{if ( $0 ~ /^[^#]/ ) print $2 }' data.dat | tail -1
       # -----^^^^^^^^

表示匹配任何第一个字符不是'#'字符的$0(行)。

您可能会遇到其他问题,因为您正在使用make。

如果这不能解决你的问题,用你的操作系统版本、你的$SHELL值、版本(如果可能的话)和gmakemake规则编辑你的帖子。同时复制/粘贴你得到的相关错误信息。

不知何故,我错过了在Makefile中您试图设置变量的范围。正如你已经注意到的,你正面临着几个问题。

当考虑make(1)以及它如何处理变量时,您应该将其视为宏处理器(与期望的shell样行为相反)。例如下面的Makefile
A = HEHE
B = HOHO
C = $A $B
A = HAHA
default:
        echo $C

输出的是"HAHA HOHO",而shell程序员期望的是"HEHE HOHO"。因此,"later"对于Makefiles来说是一个有点误导的术语。

当然你可以在规则中调用shell命令,但是要注意:规则中的每一行都是在它自己的shell进程中执行的,所以即使你设置了一个(shell -)变量,它也会在下一个命令行中丢失。

我recomendations

:

  • 如果你真的需要存储中间值,使用临时文件

  • 如果你需要编写复杂的shell命令,把它们放在一个单独的脚本文件

当然,可以在Makefile中使用行连续符( at end Of line)和扩展的转义引号来编写复杂的shell结构,而且很多人都这样做-但这不是make(1)的设计目的-生成的脚本非常难以阅读,搜索错误或错误行为是一项乏味的任务。

最新更新