Почему [...] синтаксис не работает в Makefile, в то время как `test` работает? - PullRequest
0 голосов
/ 12 октября 2018

Я на Linux Mint 19. Я совершенно новичок в Makefiles.

Вот проблемная часть:

[ $(shell id --user) -eq 0 ] && ( echo && echo "distrib target has to be run as normal user" && echo && exit 1 )

, которая выдает эту ошибку:

[ 1000 -eq 0 ] && ( echo && echo "distrib target has to be run as normal user" && echo && exit 1 )
Makefile:25: recipe for target 'distrib' failed
make: *** [distrib] Error 1

Напротив, использование команды test напрямую доказывает свою полную работоспособность:

if test $(shell id --user) -eq 0; then ( echo && echo "distrib target has to be run as normal user" && echo && exit 1 ) fi

Я хочу спросить, почему я нарушил какое-то правило Makefile?

1 Ответ

0 голосов
/ 12 октября 2018

Это не имеет ничего общего с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...