/ bin / sh: -c: строка 1: синтаксическая ошибка: неожиданный конец файла (с использованием Makefile) - PullRequest
0 голосов
/ 12 февраля 2019

У моей команды есть цель в конце Makefile, которая выглядит следующим образом:

# Fix permissions and ownership problems (only run this in development!)
fixperms:
@if [ $(OS_NAME) == "Linux" ]; then \
    @sudo chown --recursive php:php .
    @sudo chmod --recursive 0777 var/
fi

@if [ $(OS_NAME) == "Darwin" ]; then \
    @sudo chown --recursive php:php .
    @sudo chmod -R 0777 var/
fi

... и в конце она включает новую строку.Когда я запускаю make fixperms (на моем компьютере с MacOS - я не пробовал его в Linux), я получаю следующее сообщение:

/ bin / sh: -c: строка 1: синтаксисошибка: неожиданный конец файла

make: *** [fixperms] Ошибка 2

Как это исправить?

===

Правка 1: я тоже пробовал без перевода строки - результат тот же.

===

Редактировать 2: Я также попытался перестроить Makefile, чтобы в конце была другая цель.Запуск make fixperms все еще приводит к той же ошибке.Очень странно.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Мне никогда не удавалось заставить условные оболочки работать.Я перешел на использование условных файлов Makefile, которые, похоже, сделали свою работу.Итак, теперь у меня есть это:

# Fix permissions and ownership problems (only run this in development!)
fixperms:
ifeq ("$(OS_NAME)", "Linux")
    sudo chown --recursive php:php . ; sudo chmod --recursive 0777 var/
endif
ifeq ("$(OS_NAME)", "Darwin")
    sudo chown -R php:php . ; sudo chmod -R 0777 var/
endif

... что, кажется, работает хорошо.

0 голосов
/ 12 февраля 2019

Я предполагаю, что у вас есть TAB с отступом от вашего рецепта, который вы не показываете.

Проблема в том, что у вас есть только обратный слеш в конце первой строки, так что это единственная строка, которая "продолжал».Make вызывает каждую логическую строку в рецепте в отдельной оболочке, поэтому:

fixperms:
        @if [ $(OS_NAME) == "Linux" ]; then \
            @sudo chown --recursive php:php .
            @sudo chmod --recursive 0777 var/
        fi

Запускает следующие команды оболочки:

/bin/sh -c 'if [ $(OS_NAME) == "Linux" ]; then @sudo chown --recursive php:php .'
/bin/sh -c 'sudo chmod --recursive 0777 var/'
/bin/sh -c 'fi'

Вы видите, что это недопустимые сценарии оболочки;Вы получаете ошибку в первом из-за того, что вам не хватает fi.

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

fixperms:
        @if [ $(OS_NAME) == "Linux" ]; then \
            sudo chown --recursive php:php . \
            sudo chmod --recursive 0777 var/ \
        fi
        @if [ $(OS_NAME) == "Darwin" ]; then \
            sudo chown --recursive php:php . \
            sudo chmod -R 0777 var/ \
        fi

(обратите внимание на @ в середине скрипта, так как они являются метасимволами рецепта makefile и распознаются только в начале рецепта).

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

Вы могли бы рассмотреть это: http://make.mad -scientist.net / управление-рецепт-Вторя /

...