Это не имеет ничего общего с make-файлами, оно имеет отношение к сценариям оболочки и разнице между использованием &&
против if
с точки зрения кода выхода.Вы сравниваете яблоки и апельсины здесь.
Это не имеет отношения к test
против [
.Если вы напишите версию, используя [
внутри оператора if
, вы получите то же поведение, что и с test
, а если вы напишите версию test
с моделью &&
, вы получитеТо же поведение, что и с [
.
Запустите это в своей оболочке:
[ 1000 -eq 0 ] && echo hi
echo $?
Теперь запустите это в своей оболочке:
if [ 1000 -eq 0 ]; then echo hi; fi
echo $?
Вы будетесм. первый дает код выхода, отличный от 0, а второй дает код выхода 0 (успех).Вот как работает if
;он «проглатывает» код завершения условия.
Make всегда просматривает код завершения сценария оболочки, чтобы определить, не удалось он или нет.
Как правило, в сценариях make вы хотите повторно- организовать ваши выражения, чтобы использовать ||
вместо &&
.Это гарантирует, что если сценарий завершается рано, он завершается с кодом успеха, а не кодом ошибки.Вы можете написать свой скрипт следующим образом:
[ $$(id -u) -ne 0 ] || ( echo && echo "distrib target has to be run as normal user" && echo && exit 1 )
Примечание. Я использую $$(id -u)
, а не $(shell id --user)
;Рецепт уже запущен в оболочке, и использование шаблона make shell
в рецепте запрещено.Кроме того, опция -u
является стандартной опцией POSIX, в то время как --user
доступна только в версии утилит GNU id
.