Próbuję poinstruować GNU Make 3.81, aby nie zatrzymywał się, jeśli polecenie się nie powiedzie (więc poprzedzam to poleceniem -
), ale chcę również sprawdzić status wyjścia dla następnego polecenia i wydrukować bardziej pouczający komunikat. Jednak mój Makefile poniżej nie działa:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
Dlaczego powyższy plik Makefile odzwierciedla „sukces!” zamiast „porażki!” ?
aktualizacja:
Poniżej i w odpowiedzi na zaakceptowaną odpowiedź poniżej opisano, jak należy ją napisać:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.SHELLFLAGS = -ec
należy użyć. Ale w tym przypadku nie można użyć -
więcej prefiksu (do osobistego dowodu odbioru), ponieważ marka napisze, że błąd jest ignorowany, ale nadal zawiedzie cały blok. Tak, || :
jest jednym z rozwiązań ignorowania polecenia. Ale to nie jest wieloplatformowe (Windows nie ma || :
lub || true
)
.ONESHELL:
dyrektywę.