我尝试了两种方法。 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单行。
答案 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
值,版本(如果可能)以及gmake
或make
规则修改您的帖子。还要复制/粘贴您收到的相关错误消息。
我希望这会有所帮助。
答案 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 - 由此产生的脚本很难阅读和搜索错误或错误行为是一项繁琐的工作。