字符串内的Bash变量扩展(makefile)

字符串内的Bash变量扩展(makefile),bash,makefile,Bash,Makefile,我正在尝试制作一个makefile脚本,它使用tcpreplay命令和其他工具提取pcap文件中的数据包数。然后使用额外的gcc标志将数据包数转发到测试文件 tcpreplay = "/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11" # get number of packet in PCAP PKT_NUM = `eval ${tcpr

我正在尝试制作一个makefile脚本,它使用tcpreplay命令和其他工具提取pcap文件中的数据包数。然后使用额外的gcc标志将数据包数转发到测试文件

    tcpreplay = "/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11"
    # get number of packet in PCAP
    PKT_NUM = `eval ${tcpreplay}`
    TEST_CFLAGS = -DPKT_NUM=$(PKT_NUM)
    #print VAR cmd 
    print-%  : ; @echo $* = $($*)
在终端中执行上述命令时,即使tcpreplay的内容有效,也不起作用。我还发现它导致了这一部分:

"${PWD}"/to/file.pcap
与以下人员交换时:

/absolute/path/to/file.pcap
它按预期工作


那么,如何用$PWD方法修复脚本呢?

前两条语句

tcpreplay="/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11"
PKT_NUM=`eval ${tcpreplay}`
看起来很好,shell应该真正解决${PWD}。我猜这会导致一个int被分配给PKT_NUM?然而

TEST_CFLAGS=-DPKT_NUM=$(PKT_NUM)
看起来有点奇怪,因为您似乎想要执行int并将其分配给TEST\u CFLAGS


你能粘贴命令的实际输出吗?我无法复制它,因为我没有“tcpreplay”。

我不确定我是否理解您正在尝试做什么,但是如果您先将shell内容清除,您的生成文件将更清晰。在GNUMake中,使用shell函数计算shell代码。此外,GNU make为您定义PWD。因此:

tcpreplay = /usr/bin/tcpreplay --topspeed --intf1=lo $(PWD)/to/file.pcap 

# get number of packet in PCAP
PKT_NUM = $(shell $(tcprelay) | sed -n 5p | cut -d' ' -f11)
TEST_CFLAGS = -DPKT_NUM=$(PKT_NUM)
如果这不能满足您的需要,那么您可以在不使用shell函数的情况下更好地查看内容:

PKT_NUM = $$( $(tcprelay) | sed -n 5p | cut -d' ' -f11 )

我不明白你用
print-%
规则做什么的意图,但也许这会让你成功

请删除“=”号前后的空格,然后重试。不仅要在删除空格后重试,还要在此处报告结果;-)我已经删除了空格,也检查了代码,但问题仍然存在。工作目录的路径是否包含空格?因为${PWD}没有被引用。不,它没有被引用,我想问题一定在其他地方,因为使用绝对路径,一切都很好,常量PKT_NUM在我的可执行文件中定义。很抱歉,我没有提到它是一个生成文件。当我运行make print-PKT_NUM时,结果是:PKT_NUM=9975,这是正确的。然后我需要将这一部分提供给gcc编译器,它编译包测试。在上面的命令中,我的编译器引发了一个错误,它没有通过gcc命令行接收到任何-DPKT_NUM定义。我确实简化了这一点,也有SUBDIR调用,但这不重要,因为使用绝对路径,它工作得非常完美。命令
eval${tcpreplay}
的结果解析tcpreplay的输出,只给出尝试的数据包数
number
@Sach这是一个生成文件,这一事实非常相关。Makefiles不是shell脚本。@chepner,是的,我的错,我也在处理bash脚本,弄糊涂了,对不起。