9

Makefileでgrep検索の結果を確認したいのですが。この解決策とは反対に、私はシェルコマンドを使いたくありません。また、grepが文字列を見つけられないときにMakefileでエラーが発生しないようにします(終了コード1はエラーとして扱われます)。

以下は、エラーを無視して終了コードを確認しようとします。

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

残念ながら、終了コードは常に0です。

4

1 に答える 1

7

a の一連のアクションの個別の行は、makefile通常、個別のサブシェルで実行されます。あなたが求めているものをコーディングするには、次のようにします。

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-e

cdアクション内でコマンドを実行できますが、各アクションは個別に実行されるため、繰り返し実行する必要があることに気付くかもしれません。

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

はい、別の方法で行うこともできます — 私は要点を示しているだけで、プログラムのインストール方法を推奨しているわけではありません。

于 2012-10-25T13:11:57.517 に答える