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

时间:2016-07-17 22:09:38

标签: 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 ${tcpreplay}`
    TEST_CFLAGS = -DPKT_NUM=$(PKT_NUM)
    #print VAR cmd 
    print-%  : ; @echo $* = $($*)

在终端中执行时,即使tcpreplay的内容有效,上面的命令也不起作用。我也发现它导致了这一部分:

"${PWD}"/to/file.pcap

与...交换时:

/absolute/path/to/file.pcap

它按预期工作。

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

2 个答案:

答案 0 :(得分:0)

前两个陈述

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_CFLAGS?

您可以粘贴命令的实际输出吗?我无法重现它,因为我没有" tcpreplay"。

答案 1 :(得分:0)

我不确定我是否理解你要做的事情,但是如果你先把shell的东西拿走,你的Makefile会更清楚。在GNU make中,使用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-%规则所做的事情的意图,但也许这会让您前进。