oddzielnej linii szeregu działań w makefile
są zwykle wykonywane w oddzielnych podpowłokach. Kodować co jesteś po, a następnie:
all:
if grep term log*; \
then echo found; \
else echo not found; \
fi
To jedno polecenie; testuje bezpośrednio kod zakończenia grep
. Zwróć uwagę na liberalne użycie średników; Jest to konieczne, ponieważ wszystko zostaje spłaszczone po przekazaniu do powłoki. Zwróć też uwagę, że -
nie jest potrzebny; instrukcja jako całość kończy się ze statusem 0, ponieważ jedno z poleceń echo
zostało wykonane, powiodło się, i to jest stan zwrócony z pod-powłoki. Ale jest jeszcze jedna część tej sztuczki; IIRC, skrypt jest wywoływany za pomocą /bin/sh -e
, więc skrypt wychodzi z pierwszego błędu (niezerowego) statusu z polecenia powłoki - z wyjątkiem wyraźnych warunków warunkowych, takich jak if
.
Jeśli chcesz wyraźnie uchwycić stan grep
(jeśli tylko być pewien, że to zostało zrobione w prawo), a następnie:
all:
-grep term log*; \
status=$$?; echo $$status; \
if [ $$status = 0 ]; \
then echo found; \
else echo not found; \
fi
Prawdopodobnie potrzebują -
ten czas ponieważ grep
nie jest wykonywany w ramach powłoki warunkowej i niezerowy kod wyjścia może uruchomić przetwarzanie -e
. Nie polecam futzing z tym.
Możesz zauważyć, że możesz wykonywać komendy cd
w akcji i ponieważ każda czynność wykonywana jest osobno, musisz to robić wielokrotnie.
install: ${PROG}
cd ${INSTBIN}; ${RM_F} ${PROG}
${CP} ${PROG} ${INSTBIN}
cd ${INSTBIN}; ${CHOWN} ${OWNER}:${GROUP} ${PROG}; ${CHMOD} ${PERMS} ${PROG}
Tak, można to zrobić inaczej - mam demonstrując punkt, nie promując styl instalowania programów.
Och, szukałem tego! Mój dzień. Dzięki – lzap