2016-12-16 11 views
0

メッセージを出力するperlスクリプトがあります。このスクリプトはGNU makeによって呼び出されています。私のGNU makeでは、スクリプトによって出力されたメッセージを表示し、それを変数にも格納したいと考えています。出力文字列を変数に格納してコンソールに表示する方法

私はこのようにしています。

result=`$(PERL) parse.pl report.log` #parse the report 
echo $(result) #echo the message here 
ifneq ($(strip $$(result)),) #check if message is empty 
    #if not empty, search for filepath string pattern and exit 
    echo filepath 
    exit 1 
endif 

ただし、parse.plからの文字列メッセージは表示されません。

+0

:あなたは新しい-十分GNUを持っている場合

はまた、あなたがone shell機能を使用することができます作りますか?あなたのMakefileの一部も表示してください。シェル変数にキャプチャしていますが、makefile変数をエコーし​​ようとしています(makeは別のシェルプロセスで各行を実行するため、シェル変数をエコーし​​たとしても動作しません)。 – ysth

+0

詳細を更新しました。私は$結果の正規表現を行う方法をまだ分かっていないので、ヒントがあればうれしいでしょう。 –

答えて

1

あなたはシェル変数にキャプチャしていますが、makefile変数をエコーし​​ようとしています(makeは別のシェルプロセスで各行を実行するので、シェル変数をエコーし​​ても動作しません)。

シェルvaribleをエコーするためにそれを変更し、すべてが動作するはず1つのシェルで実行するために:

foo: 
    result=`$(PERL) parse.pl report.log`; \ 
    echo $$result 

をしかし、あとでまた同じシェルの実行中である必要があるキャプチャ結果を使用して行う必要があるものは何でも。

どうやらあなたがより便利になるかもしれない、あまりにもメイクファイル変数に取り込むことができます。

foo: 
    $(eval result := $(shell $(PERL) parse.pl report.log)) 
    echo $(result) 
+0

うーん..これで何も表示されません。 –

+0

は、間違った答えをより良いものに置き換えました – ysth

+0

ありがとう!それは今働く。常に$$結果として結果を参照する必要がありますか?私はそれが空であるかどうかをチェックしたい。"/ bin/sh:-c:2行目:予期しないトークン' $(result) 'の近くで構文エラーが発生しました。 /bin/sh:-c:2行目: 'ifeq($(result)、)\ '" –

0

メイクで心に留めておくべき重要なことは、どのルールが実行される前に全体のメイクファイルが解析されていることを、最初のものです2番目のメークファイルには2つの完全に異なる構文があります。ほとんどのメークファイル構文とレシピのシェル構文です。シェルの構文は、makeではなく、シェルによって実行されます。makeはシェルを起動し、レシピを渡し、シェルが終了して動作しているかどうかを確認します。

ifeqのようなmake構文をシェルコマンドとその結果と組み合わせることはできません。すべてのmake構文が最初に解析され、makefileが読み込まれていてシェルコマンドが実行されていないため、ターゲットが構築されるのはずっと後のことです。

場合によっては、シェルという構文で全体を記述する必要があります。これは、シェルの呼び出しに依存するようにするためです。このようなので、

、:実行に別のシェル内の各別の行を行います。各行がバックスラッシュで終わっているので、それは代わりに別のラインであることの前の行に追加されますか

foo: 
     result=`$(PERL) parse.pl report.log`; \ 
     echo $$result; \ 
     if [ "$$result" = "" ]; then \ 
      echo filepath; \ 
      exit 1; \ 
     fi 

注意。あなたが撮影し行と後で何をしたいか何

.ONESHELL: 
foo: 
     result=`$(PERL) parse.pl report.log` 
     echo $$result 
     if [ "$$result" = "" ]; then 
      echo filepath 
      exit 1 
     fi 
関連する問題