Пропавшие без вести Синтаксической ошибки Bash, ожидающие “затем”

Для следующих строк в моем Make-файле я получаю ошибку

Syntax error: end of file unexpected (expecting "then")

Код:

if [ ! -d upload-api/app-router/ ] then
    git clone someRepo upload-api/app-router/
fi

Я попробовал точкой с запятой после скобок, но я получаю все еще ту же ошибку

3
задан 21 August 2018 в 11:40

2 ответа

Необходимо поместить затем в точку с запятой использования или следующую строку

if [ ! -d upload-api/app-router/ ] 
then

или

if [ ! -d upload-api/app-router/ ];then
14
ответ дан 1 December 2019 в 12:56

В контексте make-файла я вижу две вещи.

Во-первых, Вам нужны точка с запятой или новая строка перед then. Синтаксис Shell для if похож: if commands... ; then commands... ; fi (где любая точка с запятой здесь может быть заменена новой строкой).

Во-вторых, когда make выполняет рецепт, он выполняет каждую отдельную строку рецепта в отдельном экземпляре оболочки и прекращает выполняться, если какая-либо одна строка дает ошибку. Эффективно, это работает:

sh -c 'if [ ! -d upload-api/app-router/ ]; then' &&
    sh -c 'git clone someRepo upload-api/app-router/' &&
    sh -c 'fi'

... который является синтаксической ошибкой на первой строке, с или без точки с запятой, потому что if никогда не заканчивается.

Таким образом для рецепта make-файла, необходимо было бы позволить make знайте, что это должно рассматривать все if ... fi блок как одна строка. Например, используйте обратные косые черты для продолжения строки и точки с запятой в соответствующих местах, так как оболочка не будет видеть разрывов строки.

my-target:
↦       if [ ! -d upload-api/app-router/ ] ; then \
↦           git clone someRepo upload-api/app-router/ ; \
↦       fi

Это становится громоздким довольно быстро, таким образом, мое предпочтительное решение состоит в том, чтобы обычно помещать сценарий оболочки в отдельный файл, затем петлять из Вашего рецепта.

3
ответ дан 1 December 2019 в 12:56

Другие вопросы по тегам:

Похожие вопросы: