2012-10-25 14 views
9

Chciałbym sprawdzić wynik wyszukiwania grep w pliku Makefile. W przeciwieństwie do this solution, nie chcę używać polecenia powłoki. Ponadto, nie chcę Makefile, aby podnieść błąd, gdy grep nie znaleźć ciąg (kod wyjścia 1 jest traktowany jako błąd).Kody wyjścia Grep w Makefile

następujące próbuje zignorować błąd i sprawdź kod wyjścia:

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

Niestety, kod wyjścia jest zawsze 0.

+0

Och, szukałem tego! Mój dzień. Dzięki – lzap

Odpowiedz

7

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.

+0

Pierwsze rozwiązanie jest bardzo eleganckie. Z detailled wyjaśnienia, akceptowane! Nie rozumiem jednak punktu z ostatniego akapitu. –

+0

Zamiast wykonywać 'cd $ {INSTBIN}; $ {RM_F} $ {PROG} ', mógłbym napisać:' ​​$ {RM_F} $ {INSTBIN}/$ {PROG} 'bez' cd' w ogóle. To wszystko, co mówię. (Pracuję na plikach Makefile, gdzie jest to w zasadzie, w jaki sposób kod jest kopiowany z obszaru kompilacji - przez root, do mojego niesmaku - do katalogu dystrybucyjnego. Nie będę was zanudzać tym, jak to się stało i dlaczego nie naprawiłem to jeszcze.) –

+0

W moim ograniczonym doświadczeniu z Makefile, jedynym użyciem cd jest wywołanie sub-Makefile. –