2016-07-17 11 views
-1

私はmakefileスクリプトを作ろうとしています。これは、tcpreplayコマンドと他のツールを使ってpcapファイルのパケット数を抽出します。追加のgccフラグを使用して、パケット数をテストファイルに転送します。文字列内のBash変数展開(メイクファイル)

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アプローチでスクリプトを修正することができますか?

+3

'='記号の前後のスペースを削除してから、もう一度お試しください。 –

+1

スペースを削除した後に再試行するだけでなく、結果についてもここに報告してください。 – Alfe

+0

スペースを削除してhttp://shellcheck.netでチェック済みのコードも残っていますが、問題は残ります。 – Sach

答えて

0

tcpreplay="/usr/bin/tcpreplay --topspeed --intf1=lo "${PWD}"/to/file.pcap | sed -n 5p | cut -d' ' -f11" 
PKT_NUM=`eval ${tcpreplay}` 

最初の二つの文はかなりOKを見て、シェルが本当に$ {PWD}を解決する必要があります。私はそれがPKT_NUMに割り当てられているintになると思いますか?しかし

TEST_CFLAGS=-DPKT_NUM=$(PKT_NUM) 

intを実行してTEST_CFLAGSに割り当てたいと思うので、少し奇妙に見えますか?

コマンドの実際の出力を貼り付けることはできますか?私は "tcpreplay"を持っていないので再現できません。

+0

申し訳ありませんが、私はそれがメイクファイルだと言及していません。 を実行してprint-PKT_NUMを実行すると、 PKT_NUM = 9975という正しい結果が得られます。それから、パケットテストをコンパイルするgccコンパイラにこの部分を提供する必要があります。上記のコマンドでは、コンパイラは、gccのコマンドラインから-DPKT_NUM定義を受け取らなかったというエラーが発生しています。私はこれを実際に単純化しました。また、SUBDIRが呼び出しを行うこともありますが、絶対パスでは完璧に機能するので問題ではありません。 – Sach

+0

コマンド 'eval $ {tcpreplay}'の結果はtcpreplayの出力を解析し、試行されたパケットの数だけが 'NUMBER'になります。 – Sach

+2

@SachそれがMakefileであるという事実はかなり関係しています。 Makefileはシェルスクリプトではありません。 – chepner

0

私はあなたがしようとしていることを理解していませんが、シェルのものを最初に取り除くとMakefileがより明確になります。 GNU makeでは、シェル関数を使ってシェルコードを評価します。また、GNU makeはあなたのための障害を定義します。だから、:

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) 

それはあなたがやりたいしない場合は、シェルの機能なしでより良いものを見ることができます:

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

は、私はあなたがやっていることの意図を理解していませんprint-%ルールが、おそらくそれはあなたを得るでしょう。

関連する問題