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