2012-10-25 24 views
9

Makefileのgrep検索の結果を確認したいと思います。 this solutionとは対照的に、私はshellコマンドを使いたくない。 また、grepが文字列を見つけられなかったときにMakefileがエラーを発生させたくない(終了コード1はエラーとして扱われます)。Makefileのgrep終了コード

エラーを無視して、終了コードを確認するには、次の試行:

all: 
    -grep term log* 
    echo $$? 
    @case "$$?" in \ 
     0)\ 
    echo "found";; \ 
    *) \ 
    echo "not found";;\ 
    esac; 

残念なことに、終了コードが常にmakefileにおける一連の動作の0

+0

ああ私はこれを探しています!私の一日を作った。ありがとう – lzap

答えて

7

別々のラインが正常です別々のサブシェルで実行されます。あなたが何をしているのかをコードするには、

all: 
    if grep term log*; \ 
    then echo found; \ 
    else echo not found; \ 
    fi 

これは1つのコマンドです。 grepの終了ステータスを直接テストします。セミコロンの自由な使用に注意してください。これはシェルに渡されるとすべてが平坦になるため必要です。 -は不要であることにも注意してください。ステートメントは全体として、echoコマンドの1つが実行され、成功し、それがサブシェルから戻された状態であるために状態0で終了します。しかし、トリックにはもう一つの部分があります。 IIRCの場合、スクリプトは/bin/sh -eで起動されるため、シェルコマンドの最初のエラー(非ゼロ)の状態でスクリプトが終了するため、ifなどの明示的な条件を除きます。

あなたは(それが適切に行われています確認する場合のみ)明示的に、grepの状態をキャプチャしたい場合:

all: 
    -grep term log*; \ 
    status=$$?; echo $$status; \ 
    if [ $$status = 0 ]; \ 
    then echo found; \ 
    else echo not found; \ 
    fi 

をおそらく-に一部として実行されていないgrepので、この時間を必要としますシェルの条件付きで0以外の終了ステータスの場合は、-eの処理がトリガーされる可能性があります。私はこれと一緒にfutzingをお勧めしません。

アクション内でcdコマンドを実行でき、各アクションが別々に実行されるため、繰り返し実行する必要があることに注意してください。

install: ${PROG} 
    cd ${INSTBIN}; ${RM_F} ${PROG} 
    ${CP} ${PROG} ${INSTBIN} 
    cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG} 

はい、あなたは違うことができます - 私は、プログラムをインストールするスタイルを提唱していない点を実証しています。

+0

最初の解決策は非常にエレガントです。 detailled説明で、受け入れられる! 私は最後の段落の要点を強調していません。 –

+0

'cd $ {INSTBIN};を実行する代わりに。 $ {RM_F} $ {INSTBIN}/$ {PROG} 'と書くことができます。それは私が言っていることだ。 (私はmakefileを基本的にどのようにコードがビルド領域からルートディレクトリ、嫌なディレクトリ、ディストリビューションディレクトリにコピーされているのかを知っています。それはまだです。) –

+0

私の限られた経験のあるMakefileでは、cdの唯一の使用はサブメイクファイルを呼び出すことです。 –