В makefile, когда я использую внутри bash функцию if, это ошибка throw - PullRequest
0 голосов
/ 18 января 2020

В make-файле, когда я использую внутри bash функцию if, если это оператор, это ошибка throw *

test : 
        foo() { if [[ "a" == "a" ]] ; then echo $$1 ; fi ; } ; foo "hello"

ERROR

/ bin / sh: 1: [[: not найдено

или с одним [

test : 
        foo() { if [ "a" == "a" ] ; then echo $$1 ; fi ; } ; foo "hello"

ОШИБКА

/ bin / sh: 1: [: a: неожиданный оператор

как я могу использовать оператор if в этом случае

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Вы используете bash -specifi c функции. Make не запускает пользовательскую оболочку, она всегда использует /bin/sh по умолчанию. В некоторых системах /bin/sh - это ссылка на /bin/bash, и ваш make-файл будет работать. В других системах /bin/sh является ссылкой на оболочку POSIX, например dash.

POSIX не разрешает [[ ... ]], он использует только [ ... ]. Кроме того, в тесте POSIX равенство равно =, а не ==. Только bash допускает == в качестве расширения.

Итак, если вы хотите, чтобы ваша команда была POSIX-совместимой, она должна быть:

test : 
        foo() { if [ "a" = "a" ]; then echo $$1; fi; }; foo "hello"
2 голосов
/ 18 января 2020

Кажется, /bin/sh не /bin/bash. Вам нужно установить оболочку в Makefile:

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