Le linee separate di una serie di azioni in un makefile
sono normalmente eseguito in sotto-shell separate. Per codificare ciò che stai cercando, quindi:
all:
if grep term log*; \
then echo found; \
else echo not found; \
fi
Questo è un comando singolo; verifica direttamente lo stato di uscita di grep
. Nota l'uso liberale del punto e virgola; è necessario perché tutto viene appiattito quando viene passato alla shell. Nota anche che lo -
non è necessario; l'istruzione nel suo complesso si chiude con lo stato 0 poiché uno dei comandi echo
viene eseguito, ha esito positivo, e quello è lo stato restituito dalla sub-shell. Ma c'è un'altra parte del trucco; IIRC, lo script viene invocato con /bin/sh -e
in modo che lo script venga chiuso al primo errore (diverso da zero) da un comando shell, tranne che in condizionali espliciti come if
.
Se si desidera catturare in modo esplicito lo stato di grep
(se non altro per essere sicuri che è stato fatto a destra), quindi:
all:
-grep term log*; \
status=$$?; echo $$status; \
if [ $$status = 0 ]; \
then echo found; \
else echo not found; \
fi
probabilmente è necessario il -
questa volta perché il grep
non viene eseguita come parte di uno shell condizionale e uno stato di uscita diverso da zero potrebbero attivare l'elaborazione -e
. Non consiglio di perdere tempo con questo.
È possibile notare che è possibile eseguire i comandi cd
in un'azione e poiché ciascuna azione viene eseguita separatamente, è necessario farlo ripetutamente.
install: ${PROG}
cd ${INSTBIN}; ${RM_F} ${PROG}
${CP} ${PROG} ${INSTBIN}
cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}
Sì, è possibile farlo in modo diverso - Sto dimostrando un punto, non sostenendo uno stile di installare programmi.
fonte
2012-10-25 13:11:57
Oh, stavo cercando questo! Ha reso la mia giornata. Grazie – lzap