Я намагаюся доручити GNU Make 3.81 не зупинятися, якщо команда не спрацьовує (тому я вказую префікс команди -
), але я також хочу перевірити стан виходу в наступній команді та надрукувати більш інформативне повідомлення. Однак мій Makefile нижче не вдається:
$ 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!
Чому Makefile вище перегукується з "успіхом!" замість "провал!" ?
оновлення:
Слідуючи та розширюючи прийняту відповідь, нижче - як слід писати:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.SHELLFLAGS = -ec
слід використовувати. Але в цьому випадку ви більше не можете використовувати -
префікс (для особистої команди квитанції), тому що make запише, що помилка ігнорується, але все-таки вийде з ладу весь блок. Отже, || :
це одне рішення для ігнорування команди. Але це не крос-платформа (у Windows немає || :
чи || true
)
.ONESHELL:
директиву.