如何将(特定的)awk命令用于make,并将结果保存到变量中?

时间:2011-09-20 17:47:43

标签: escaping makefile 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:半解决方案......我忘记使用$$来赚取$。希望这允许我发布一个解决方案。

编辑3:在定义make变量期间,似乎在make中解析括号的方式,不允许使用它们的shell函数调用的use命令。基本上这意味着如果想要存储结果,就无法真正使用gawk单行。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以重写您的reg-exp以移动发生否定的地方,即

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

表示匹配任何$ 0(行),其中第一个char不是'#'char。

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

如果这不能解决您的问题,请使用您的操作系统版本,$SHELL值,版本(如果可能)以及gmakemake规则修改您的帖子。还要复制/粘贴您收到的相关错误消息。

我希望这会有所帮助。

答案 2 :(得分:1)

不知怎的,我想念你试图设置变量的Makefile中的范围。正如您已经注意到的那样,您面临着一些问题。

当考虑 make(1)以及它如何处理变量时,您应该将其视为宏处理器(与预期类似shell的行为相反)。例如以下Makefile

A = HEHE
B = HOHO
C = $A $B
A = HAHA

default:
        echo $C

产生输出“HAHA HOHO”,而shell程序员则期望“HEHE HOHO”。所以“稍后”对于Makefiles来说是一个有点误导性的术语。

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

我的推荐:

  • 如果您确实需要存储中间值,请使用临时文件。

  • 如果您需要编写复杂的shell命令,请将它们放在单独的脚本文件中

当然可以使用行继续(\在行尾)和扩展使用转义引号来编写Makefile中的复杂shell构造,很多人这样做 - 但这不是make(1)的设计for - 由此产生的脚本很难阅读和搜索错误或错误行为是一项繁琐的工作。