В файле makefile, когда я использую внутреннюю функцию bash, если оператор выдает ошибку

#shell #makefile #gnu-make

Вопрос:

В файле makefile, когда я использую внутреннюю функцию bash, если оператор выдает ошибку

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

ошибка

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

или с одним [

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

ошибка

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

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

Ответ №1:

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

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

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

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

Комментарии:

1. «Всегда» — это не совсем точно. Смотрите мой ответ о том, как использовать другую оболочку.

2. Я изменил свое утверждение на всегда использует /bin/sh *по умолчанию* , что я и имел в виду. Спасибо за записку.

3. Просто к вашему сведению, не все системы поставляются /bin/bash . Я всегда предпочитаю просто писать свои рецепты, используя возможности POSIX sh, если только bash не предоставляет что-то настолько полезное, что это оправданно в качестве требования.

Ответ №2:

Похоже /bin/sh , это не /bin/bash так . Вам нужно установить оболочку в файле Makefile:

 SHELL = /bin/bash