#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